diff options
author | Phil Oester <kernel@linuxace.com> | 2013-05-27 06:55:11 +0000 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@soleta.eu> | 2013-05-29 19:45:46 +0200 |
commit | 17fd36631d3ca17b581be9acb8ab054931b5a917 (patch) | |
tree | a07c1faab5e6ac245d3f5f64df3890e0fd635104 | |
parent | 14bca55dde79adddd77999ae262b8132ae0396f9 (diff) | |
download | platform_external_iptables-17fd36631d3ca17b581be9acb8ab054931b5a917.tar.gz platform_external_iptables-17fd36631d3ca17b581be9acb8ab054931b5a917.tar.bz2 platform_external_iptables-17fd36631d3ca17b581be9acb8ab054931b5a917.zip |
xtables: improve get_modprobe handling
In bug #455, Dmitry V. Levin proposed a more robust get_modprobe
implementation. The patch below is a version of his patch,
updated to apply to current git.
This closes bug #455.
Signed-off-by: Phil Oester <kernel@linuxace.com>
Signed-off-by: Pablo Neira Ayuso <pablo@soleta.eu>
-rw-r--r-- | libxtables/xtables.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/libxtables/xtables.c b/libxtables/xtables.c index 009ab911..ebc77b6c 100644 --- a/libxtables/xtables.c +++ b/libxtables/xtables.c @@ -305,8 +305,8 @@ static char *get_modprobe(void) { int procfile; char *ret; + int count; -#define PROCFILE_BUFSIZ 1024 procfile = open(PROC_SYS_MODPROBE, O_RDONLY); if (procfile < 0) return NULL; @@ -316,19 +316,19 @@ static char *get_modprobe(void) exit(1); } - ret = malloc(PROCFILE_BUFSIZ); + ret = malloc(PATH_MAX); if (ret) { - memset(ret, 0, PROCFILE_BUFSIZ); - switch (read(procfile, ret, PROCFILE_BUFSIZ)) { - case -1: goto fail; - case PROCFILE_BUFSIZ: goto fail; /* Partial read. Wierd */ + count = read(procfile, ret, PATH_MAX); + if (count > 0 && count < PATH_MAX) + { + if (ret[count - 1] == '\n') + ret[count - 1] = '\0'; + else + ret[count] = '\0'; + close(procfile); + return ret; } - if (ret[strlen(ret)-1]=='\n') - ret[strlen(ret)-1]=0; - close(procfile); - return ret; } - fail: free(ret); close(procfile); return NULL; |