diff options
author | H. Peter Anvin <hpa@zytor.com> | 2010-07-02 09:39:18 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2010-07-02 09:39:18 -0700 |
commit | cb88d31c15a2803950e81663e4d808a31ba4f8c0 (patch) | |
tree | 5b71201fa9b454ab8e4e818053455dc9f831f92b | |
parent | 63a5a1a7cac1147e80534edcef3b410e5a8119b8 (diff) | |
download | syslinux-cb88d31c15a2803950e81663e4d808a31ba4f8c0.tar.gz |
installers: handle asprintf() correctly
It appears that the glibc version of asprintf() is braindamaged, and
doesn't set the target pointer to NULL in the event of an error (only
returns -1). Therefore we need to check the return value. Just in
case someone else made the *opposite* error, also check the pointer.
Bleh. The glibc documentation states that *BSD sets the pointer to
NULL, but instead of following that, the glibc people put
warn_unused_result on asprintf. Sigh.
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r-- | extlinux/main.c | 11 | ||||
-rw-r--r-- | libinstaller/advio.c | 14 | ||||
-rw-r--r-- | linux/syslinux.c | 10 |
3 files changed, 19 insertions, 16 deletions
diff --git a/extlinux/main.c b/extlinux/main.c index 68e6457e..daebc101 100644 --- a/extlinux/main.c +++ b/extlinux/main.c @@ -350,12 +350,13 @@ int ext2_fat_install_file(const char *path, int devfd, struct stat *rst) char *file, *oldfile; int fd = -1, dirfd = -1; int modbytes; + int r1, r2; - asprintf(&file, "%s%sldlinux.sys", - path, path[0] && path[strlen(path) - 1] == '/' ? "" : "/"); - asprintf(&oldfile, "%s%sextlinux.sys", - path, path[0] && path[strlen(path) - 1] == '/' ? "" : "/"); - if (!file || !oldfile) { + r1 = asprintf(&file, "%s%sldlinux.sys", + path, path[0] && path[strlen(path) - 1] == '/' ? "" : "/"); + r2 = asprintf(&oldfile, "%s%sextlinux.sys", + path, path[0] && path[strlen(path) - 1] == '/' ? "" : "/"); + if (r1 < 0 || !file || r2 < 0 || !oldfile) { perror(program); return 1; } diff --git a/libinstaller/advio.c b/libinstaller/advio.c index 7bfc098c..56f607d0 100644 --- a/libinstaller/advio.c +++ b/libinstaller/advio.c @@ -45,11 +45,12 @@ int read_adv(const char *path, const char *cfg) int fd = -1; struct stat st; int err = 0; + int rv; - asprintf(&file, "%s%s%s", - path, path[0] && path[strlen(path) - 1] == '/' ? "" : "/", cfg); + rv = asprintf(&file, "%s%s%s", path, + path[0] && path[strlen(path) - 1] == '/' ? "" : "/", cfg); - if (!file) { + if (rv < 0 || !file) { perror(program); return -1; } @@ -97,11 +98,12 @@ int write_adv(const char *path, const char *cfg) int fd = -1; struct stat st, xst; int err = 0; + int rv; - err = asprintf(&file, "%s%s%s", - path, path[0] && path[strlen(path) - 1] == '/' ? "" : "/", cfg); + rv = asprintf(&file, "%s%s%s", path, + path[0] && path[strlen(path) - 1] == '/' ? "" : "/", cfg); - if (!file) { + if (rv < 0 || !file) { perror(program); return -1; } diff --git a/linux/syslinux.c b/linux/syslinux.c index 70fadcd0..9462138f 100644 --- a/linux/syslinux.c +++ b/linux/syslinux.c @@ -261,11 +261,11 @@ int main(int argc, char *argv[]) /* Note: subdir is guaranteed to start and end in / */ if (opt.directory && opt.directory[0]) { int len = strlen(opt.directory); - asprintf(&subdir, "%s%s%s", - opt.directory[0] == '/' ? "" : "/", - opt.directory, - opt.directory[len-1] == '/' ? "" : "/"); - if (!subdir) { + int rv = asprintf(&subdir, "%s%s%s", + opt.directory[0] == '/' ? "" : "/", + opt.directory, + opt.directory[len-1] == '/' ? "" : "/"); + if (rv < 0 || !subdir) { perror(program); exit(1); } |