svn commit: trunk/busybox/libbb

vda at busybox.net vda at busybox.net
Mon Jul 23 17:40:38 UTC 2007


Author: vda
Date: 2007-07-23 10:40:35 -0700 (Mon, 23 Jul 2007)
New Revision: 19236

Log:
getopt32 must remain NOFORK-safe (no mallocs!). Using alloca and pretending
stack is infinite. Unfortunately, +79 bytes.



Modified:
   trunk/busybox/libbb/getopt32.c


Changeset:
Modified: trunk/busybox/libbb/getopt32.c
===================================================================
--- trunk/busybox/libbb/getopt32.c	2007-07-23 17:14:14 UTC (rev 19235)
+++ trunk/busybox/libbb/getopt32.c	2007-07-23 17:40:35 UTC (rev 19236)
@@ -307,7 +307,7 @@
 	va_list p;
 #if ENABLE_GETOPT_LONG
 	const struct option *l_o;
-	struct option *long_options = NULL;
+	struct option *long_options = (struct option *) &bb_null_long_options;
 #endif
 	unsigned trigger;
 	char **pargv = NULL;
@@ -350,11 +350,11 @@
 		count = 1;
 		optstr = applet_long_options;
 		while (optstr[0]) {
-			optstr += strlen(optstr) + 3; /* skip \0, has_arg, val */
+			optstr += strlen(optstr) + 3; /* skip NUL, has_arg, val */
 			count++;
 		}
 		/* count == no. of longopts + 1 */
-		long_options = xzalloc(count * sizeof(*long_options));
+		long_options = alloca(count * sizeof(*long_options));
 		i = 0;
 		optstr = applet_long_options;
 		while (--count) {
@@ -476,7 +476,7 @@
 	 * (supposed to act as --header, but doesn't) */
 #if ENABLE_GETOPT_LONG
 	while ((c = getopt_long(argc, argv, applet_opts,
-			long_options ? long_options : bb_null_long_options, NULL)) != -1) {
+			long_options, NULL)) != -1) {
 #else
 	while ((c = getopt(argc, argv, applet_opts)) != -1) {
 #endif
@@ -535,9 +535,6 @@
 	if (argc < min_arg || (max_arg >= 0 && argc > max_arg))
 		bb_show_usage();
 
-#if ENABLE_GETOPT_LONG
-	free(long_options);
-#endif
 	option_mask32 = flags;
 	return flags;
 }




More information about the busybox-cvs mailing list