[syslinux:master] installers: handle asprintf() correctly

syslinux-bot for H. Peter Anvin hpa at zytor.com
Fri Jul 2 09:42:02 PDT 2010


Commit-ID:  cb88d31c15a2803950e81663e4d808a31ba4f8c0
Gitweb:     http://syslinux.zytor.com/commit/cb88d31c15a2803950e81663e4d808a31ba4f8c0
Author:     H. Peter Anvin <hpa at zytor.com>
AuthorDate: Fri, 2 Jul 2010 09:39:18 -0700
Committer:  H. Peter Anvin <hpa at zytor.com>
CommitDate: Fri, 2 Jul 2010 09:39:18 -0700

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 at zytor.com>


---
 extlinux/main.c      |   11 ++++++-----
 libinstaller/advio.c |   14 ++++++++------
 linux/syslinux.c     |   10 +++++-----
 3 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/extlinux/main.c b/extlinux/main.c
index 68e6457..daebc10 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 7bfc098..56f607d 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 70fadcd..9462138 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);
 	}



More information about the Syslinux-commits mailing list