diff options
author | Jouni Malinen <jouni@qca.qualcomm.com> | 2014-10-07 20:47:13 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-10-07 20:47:13 +0000 |
commit | 907fe1cb0a32f78039e3a4ebe0c4b161da120061 (patch) | |
tree | 913a7e255572d9c58075fc460f96b3ef43e369d0 | |
parent | a3015e7a7aee0fbd3decdfd61d282344de9236f8 (diff) | |
parent | 772e12cfed81754a9fd890be7bc77bc602a549b5 (diff) | |
download | wpa_supplicant_8-lollipop-wear-release.tar.gz |
am 772e12cf: Cumulative security CVE-2014-3686 patchandroid-wear-5.0.0_r1lollipop-wear-release
* commit '772e12cfed81754a9fd890be7bc77bc602a549b5':
Cumulative security CVE-2014-3686 patch
-rw-r--r-- | hostapd/hostapd_cli.c | 25 | ||||
-rw-r--r-- | src/utils/os.h | 9 | ||||
-rw-r--r-- | src/utils/os_unix.c | 55 | ||||
-rw-r--r-- | src/utils/os_win32.c | 6 | ||||
-rw-r--r-- | wpa_supplicant/wpa_cli.c | 25 |
5 files changed, 86 insertions, 34 deletions
diff --git a/hostapd/hostapd_cli.c b/hostapd/hostapd_cli.c index 1c4a84c6..95f28d33 100644 --- a/hostapd/hostapd_cli.c +++ b/hostapd/hostapd_cli.c @@ -238,28 +238,19 @@ static int hostapd_cli_cmd_mib(struct wpa_ctrl *ctrl, int argc, char *argv[]) static int hostapd_cli_exec(const char *program, const char *arg1, const char *arg2) { - char *cmd; + char *arg; size_t len; int res; - int ret = 0; - len = os_strlen(program) + os_strlen(arg1) + os_strlen(arg2) + 3; - cmd = os_malloc(len); - if (cmd == NULL) + len = os_strlen(arg1) + os_strlen(arg2) + 2; + arg = os_malloc(len); + if (arg == NULL) return -1; - res = os_snprintf(cmd, len, "%s %s %s", program, arg1, arg2); - if (res < 0 || (size_t) res >= len) { - os_free(cmd); - return -1; - } - cmd[len - 1] = '\0'; -#ifndef _WIN32_WCE - if (system(cmd) < 0) - ret = -1; -#endif /* _WIN32_WCE */ - os_free(cmd); + os_snprintf(arg, len, "%s %s", arg1, arg2); + res = os_exec(program, arg, 1); + os_free(arg); - return ret; + return res; } diff --git a/src/utils/os.h b/src/utils/os.h index f196209b..b9247d89 100644 --- a/src/utils/os.h +++ b/src/utils/os.h @@ -601,6 +601,15 @@ size_t os_strlcpy(char *dest, const char *src, size_t siz); */ int os_memcmp_const(const void *a, const void *b, size_t len); +/** + * os_exec - Execute an external program + * @program: Path to the program + * @arg: Command line argument string + * @wait_completion: Whether to wait until the program execution completes + * Returns: 0 on success, -1 on error + */ +int os_exec(const char *program, const char *arg, int wait_completion); + #ifdef OS_REJECT_C_LIB_FUNCTIONS #define malloc OS_DO_NOT_USE_malloc diff --git a/src/utils/os_unix.c b/src/utils/os_unix.c index 7498967e..523a4d02 100644 --- a/src/utils/os_unix.c +++ b/src/utils/os_unix.c @@ -9,6 +9,7 @@ #include "includes.h" #include <time.h> +#include <sys/wait.h> #ifdef ANDROID #include <sys/capability.h> @@ -554,3 +555,57 @@ char * os_strdup(const char *s) } #endif /* WPA_TRACE */ + + +int os_exec(const char *program, const char *arg, int wait_completion) +{ + pid_t pid; + int pid_status; + + pid = fork(); + if (pid < 0) { + perror("fork"); + return -1; + } + + if (pid == 0) { + /* run the external command in the child process */ + const int MAX_ARG = 30; + char *_program, *_arg, *pos; + char *argv[MAX_ARG + 1]; + int i; + + _program = os_strdup(program); + _arg = os_strdup(arg); + + argv[0] = _program; + + i = 1; + pos = _arg; + while (i < MAX_ARG && pos && *pos) { + while (*pos == ' ') + pos++; + if (*pos == '\0') + break; + argv[i++] = pos; + pos = os_strchr(pos, ' '); + if (pos) + *pos++ = '\0'; + } + argv[i] = NULL; + + execv(program, argv); + perror("execv"); + os_free(_program); + os_free(_arg); + exit(0); + return -1; + } + + if (wait_completion) { + /* wait for the child process to complete in the parent */ + waitpid(pid, &pid_status, 0); + } + + return 0; +} diff --git a/src/utils/os_win32.c b/src/utils/os_win32.c index 55937dec..57ee1326 100644 --- a/src/utils/os_win32.c +++ b/src/utils/os_win32.c @@ -258,3 +258,9 @@ int os_memcmp_const(const void *a, const void *b, size_t len) return res; } + + +int os_exec(const char *program, const char *arg, int wait_completion) +{ + return -1; +} diff --git a/wpa_supplicant/wpa_cli.c b/wpa_supplicant/wpa_cli.c index 8811d6fd..0ad61870 100644 --- a/wpa_supplicant/wpa_cli.c +++ b/wpa_supplicant/wpa_cli.c @@ -3149,28 +3149,19 @@ static int str_match(const char *a, const char *b) static int wpa_cli_exec(const char *program, const char *arg1, const char *arg2) { - char *cmd; + char *arg; size_t len; int res; - int ret = 0; - len = os_strlen(program) + os_strlen(arg1) + os_strlen(arg2) + 3; - cmd = os_malloc(len); - if (cmd == NULL) - return -1; - res = os_snprintf(cmd, len, "%s %s %s", program, arg1, arg2); - if (res < 0 || (size_t) res >= len) { - os_free(cmd); + len = os_strlen(arg1) + os_strlen(arg2) + 2; + arg = os_malloc(len); + if (arg == NULL) return -1; - } - cmd[len - 1] = '\0'; -#ifndef _WIN32_WCE - if (system(cmd) < 0) - ret = -1; -#endif /* _WIN32_WCE */ - os_free(cmd); + os_snprintf(arg, len, "%s %s", arg1, arg2); + res = os_exec(program, arg, 1); + os_free(arg); - return ret; + return res; } |