[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [d-i] Yet Another bug with pre-sprintf malloc:ing



ons 2002-08-28 klockan 16.45 skrev Tollef Fog Heen:
> * Colin Walters 
> 
> | I guess this is up to Mithrandir...what do you think?
> 
> I'd say go ahead.

I attached a patch for using asprintf in anna, main-menu, choose-mirror,
wget-retriever and udpkg. udpkg's makefile.in also adds -D_GNU_SOURCE.
Not checking it in configure is suboptimal, yes, but I can't summon up
enough courage to work with autotools right now.


Regards,
Martin
Index: anna/anna.c
===================================================================
RCS file: /cvs/debian-boot/debian-installer/anna/anna.c,v
retrieving revision 1.12
diff -u -r1.12 anna.c
--- anna/anna.c	27 May 2002 14:08:45 -0000	1.12
+++ anna/anna.c	28 Aug 2002 16:53:15 -0000
@@ -46,9 +46,9 @@
 
 /* Calls udpkg to unpack a package. */
 int unpack_package (char *pkgfile) {
-	char *command=malloc(strlen(DPKG_UNPACK_COMMAND) + 1 +
-			     strlen(pkgfile) + 1);
-	sprintf(command, "%s %s", DPKG_UNPACK_COMMAND, pkgfile);
+	char *command;
+
+	asprintf(&command, "%s %s", DPKG_UNPACK_COMMAND, pkgfile);
 	return ! system(command);
 }
 
@@ -98,9 +98,7 @@
 			for(f = fp = p->filename; *fp != 0; fp++)
 				if (*fp == '/')
 					f = ++fp;
-			dest_file=malloc(strlen(DOWNLOAD_DIR) + 1 +
-					 strlen(f) + 1);
-			sprintf(dest_file, "%s/%s", DOWNLOAD_DIR, f);
+			asprintf(&dest_file, "%s/%s", DOWNLOAD_DIR, f);
 
 			if (! get_package(p, dest_file)) {
 				fprintf(stderr, "anna: error getting %s!\n",
Index: anna/retriever.c
===================================================================
RCS file: /cvs/debian-boot/debian-installer/anna/retriever.c,v
retrieving revision 1.12
diff -u -r1.12 retriever.c
--- anna/retriever.c	28 Aug 2002 07:24:49 -0000	1.12
+++ anna/retriever.c	28 Aug 2002 16:53:15 -0000
@@ -81,9 +81,9 @@
 int get_package (struct package_t *package, char *dest) {
 	int ret;
 	char *retriever=chosen_retriever();
-	char *command=malloc(strlen(retriever) + 1 + strlen(package->filename) +
-				     1 + strlen(dest) + 1);
-	sprintf(command, "%s %s %s", retriever, package->filename, dest);
+	char *command;
+
+	asprintf(&command, "%s %s %s", retriever, package->filename, dest);
 	ret=! system(command);
 	free(command);
 	return ret;
@@ -108,11 +108,10 @@
         int currsuite = 0;
         suite = suites[currsuite];
         while (suite != NULL) {
-          char *command=malloc(strlen(retriever) + 10 + 
-                               sizeof(tmp_packages) + 1 + strlen(suite));
+		char *command;
 
                 unlink(tmp_packages);
-                sprintf(command, "%s Packages %s %s", retriever, tmp_packages, 
+                asprintf(&command, "%s Packages %s %s", retriever, tmp_packages, 
                         suite);
                 fprintf(stderr,"%s\n", command);
                 if (system(command) != 0) {
Index: main-menu/main-menu.c
===================================================================
RCS file: /cvs/debian-boot/debian-installer/main-menu/main-menu.c,v
retrieving revision 1.30
diff -u -r1.30 main-menu.c
--- main-menu/main-menu.c	27 May 2002 14:12:56 -0000	1.30
+++ main-menu/main-menu.c	28 Aug 2002 16:53:16 -0000
@@ -85,16 +85,21 @@
 
 /* Returns true if the given package could be the default menu item. */
 int isdefault(struct package_t *p) {
-	char menutest[1024];
+	char *menutest;
 	struct stat statbuf;
+	int ret;
 
-	sprintf(menutest, DPKGDIR "info/%s.menutest", p->package);
+	asprintf(&menutest, DPKGDIR "info/%s.menutest", p->package);
 	if (stat(menutest, &statbuf) == 0) {
-		return ! SYSTEM(menutest);
+		ret = SYSTEM(menutest);
+		free(menutest);
+		return !ret;
 	}
 	else if (p->status == unpacked || p->status == half_configured) {
+		free(menutest);
 		return 1;
 	}
+	free(menutest);
 	return 0;
 }
 
@@ -206,13 +211,16 @@
 }
 
 int do_menu_item(struct package_t *p) {
-	char configcommand[1024];
+	char *configcommand;
 	struct package_t *head = NULL, *tail = NULL;
+	int ret;
 	
 	if (p->status == installed) {
 		/* The menu item is already configured, so reconfigure it. */
-		sprintf(configcommand, "dpkg-reconfigure %s", p->package);
-		return ! SYSTEM(configcommand);
+		asprintf(&configcommand, "dpkg-reconfigure %s", p->package);
+		ret = SYSTEM(configcommand);
+		free(configcommand);
+		return !ret;
 	}
 	else if (p->status == unpacked || p->status == half_configured) {
 		/*
@@ -223,8 +231,10 @@
 		order_done(head);
 		for (p = head; p; p = p->next) {
 			if (p->status == unpacked || p->status == half_configured) {
-				sprintf(configcommand, DPKG_CONFIGURE_COMMAND " %s", p->package);
-				if (SYSTEM(configcommand) != 0)
+				asprintf(&configcommand, DPKG_CONFIGURE_COMMAND " %s", p->package);
+				ret = SYSTEM(configcommand);
+				free(configcommand);
+				if (ret != 0)
 					return 0; /* give up on failure */
 			}
 		}
Index: retriever/choose-mirror/choose-mirror.c
===================================================================
RCS file: /cvs/debian-boot/debian-installer/retriever/choose-mirror/choose-mirror.c,v
retrieving revision 1.10
diff -u -r1.10 choose-mirror.c
--- retriever/choose-mirror/choose-mirror.c	13 Aug 2002 16:00:22 -0000	1.10
+++ retriever/choose-mirror/choose-mirror.c	28 Aug 2002 16:53:16 -0000
@@ -31,9 +31,7 @@
 	debconf->command(debconf, "GET", DEBCONF_BASE "protocol", NULL);
 	protocol = strdup(debconf->value);
 	
-	ret = malloc(strlen(DEBCONF_BASE) + strlen(protocol) + strlen(string) + 2);
-	/* +2 since we need one for the slash and one for the terminating NULL */
-	sprintf(ret,"%s%s/%s",DEBCONF_BASE,protocol,string);
+	asprintf(&ret,"%s%s/%s",DEBCONF_BASE,protocol,string);
 	free(protocol);
 	return ret;
 }
Index: retriever/wget/wget-retriever.c
===================================================================
RCS file: /cvs/debian-boot/debian-installer/retriever/wget/wget-retriever.c,v
retrieving revision 1.16
diff -u -r1.16 wget-retriever.c
--- retriever/wget/wget-retriever.c	13 Aug 2002 16:07:04 -0000	1.16
+++ retriever/wget/wget-retriever.c	28 Aug 2002 16:53:16 -0000
@@ -44,28 +44,15 @@
 	if (strcmp(src, "Packages") == 0) {
                 if (argc == 4) {
                         /* third argument is which suite we want */
-                        src = malloc(strlen("dists/") + strlen(distribution)
-                                     + 1 /* / */ +
-                                     + strlen(argv[3]) + 
-                                     strlen("/debian-installer/binary-" 
-                                            ARCH "/Packages") + 1);
-                        sprintf(src,"dists/%s/%s/debian-installer/binary-" 
-                                ARCH "/Packages", distribution, argv[3]);
+                        asprintf(&src,"dists/%s/%s/debian-installer/binary-" 
+                                 ARCH "/Packages", distribution, argv[3]);
                 } else {
-                        src = malloc(strlen("dists/") + strlen(distribution)
-                                     + 1 /* / */ +
-                                     + strlen("main") + 
-                                     strlen("/debian-installer/binary-" 
-                                            ARCH "/Packages") + 1);
-                        sprintf(src,"dists/%s/main/debian-installer/binary-" 
-                                ARCH "/Packages", distribution);
+                        asprintf(&src,"dists/%s/main/debian-installer/binary-" 
+                                 ARCH "/Packages", distribution);
                 }
         }
 	
-	command=malloc( 18 /* wget -c -q http:// */ + strlen(hostname) +
-			strlen(directory) + 1 /* / */ + strlen(src) +
-			4 /*  -O  */ + strlen(argv[2]) + 1);
-	sprintf(command, "wget -c -q http://%s%s/%s -O %s", hostname,
+	asprintf(&command, "wget -c -q http://%s%s/%s -O %s", hostname,
 			directory, src, argv[2]);
         fprintf(stderr,"wget: %s\n", command);
 	ret=system(command);
Index: tools/udpkg/makefile.in
===================================================================
RCS file: /cvs/debian-boot/debian-installer/tools/udpkg/makefile.in,v
retrieving revision 1.7
diff -u -r1.7 makefile.in
--- tools/udpkg/makefile.in	2 May 2002 06:29:41 -0000	1.7
+++ tools/udpkg/makefile.in	28 Aug 2002 16:53:16 -0000
@@ -1,5 +1,5 @@
 CC=@CC@
-CFLAGS=@CFLAGS@ -DADMINDIR=\"@ADMINDIR@\"
+CFLAGS=@CFLAGS@ -D_GNU_SOURCE -DADMINDIR=\"@ADMINDIR@\"
 OBJS=$(subst .c,.o,$(wildcard *.c))
 BIN=udpkg
 BUSYBOX=@BUSYBOXDIR@
Index: tools/udpkg/udpkg.c
===================================================================
RCS file: /cvs/debian-boot/debian-installer/tools/udpkg/udpkg.c,v
retrieving revision 1.26
diff -u -r1.26 udpkg.c
--- tools/udpkg/udpkg.c	1 Aug 2002 09:12:50 -0000	1.26
+++ tools/udpkg/udpkg.c	28 Aug 2002 16:53:17 -0000
@@ -371,8 +371,7 @@
 				p->file = *argv;
 			else if (opt != 'c')
 			{
-				p->file = malloc(strlen(cwd) + strlen(*argv) + 2);
-				sprintf(p->file, "%s/%s", cwd, *argv);
+				asprintf(&p->file, "%s/%s", cwd, *argv);
 			}
 			else {
 				p->package = strdup(*argv);

Attachment: signature.asc
Description: Detta =?ISO-8859-1?Q?=E4r?= en digitalt signerad meddelandedel


Reply to: