wok-current rev 287

Busybox: patch fix
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Feb 28 12:30:56 2008 +0000 (2008-02-28)
parents 83a60b321c15
children a432ed283969
files busybox/receipt busybox/stuff/busybox-1.7.3-patch.u busybox/stuff/busybox-1.7.3-script.u
line diff
     1.1 --- a/busybox/receipt	Wed Feb 27 16:38:56 2008 +0100
     1.2 +++ b/busybox/receipt	Thu Feb 28 12:30:56 2008 +0000
     1.3 @@ -16,6 +16,7 @@
     1.4  {
     1.5      patch -p0 < stuff/$PACKAGE-$VERSION-hexdump.u
     1.6      patch -p0 < stuff/$PACKAGE-$VERSION-df.u
     1.7 +    patch -p0 < stuff/$PACKAGE-$VERSION-patch.u
     1.8      patch -p0 < stuff/$PACKAGE-$VERSION-script.u
     1.9      cp stuff/$PACKAGE-$VERSION.config $PACKAGE-$VERSION/.config
    1.10      cd $PACKAGE-$VERSION
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/busybox/stuff/busybox-1.7.3-patch.u	Thu Feb 28 12:30:56 2008 +0000
     2.3 @@ -0,0 +1,258 @@
     2.4 +--- busybox-1.7.3/editors/patch.c
     2.5 ++++ busybox-1.7.3/editors/patch.c
     2.6 +@@ -23,11 +23,9 @@
     2.7 + 
     2.8 + #include "libbb.h"
     2.9 + 
    2.10 +-static unsigned int copy_lines(FILE *src_stream, FILE *dest_stream, const unsigned int lines_count)
    2.11 ++static unsigned int copy_lines(FILE *src_stream, FILE *dest_stream, unsigned int lines_count)
    2.12 + {
    2.13 +-	unsigned int i = 0;
    2.14 +-
    2.15 +-	while (src_stream && (i < lines_count)) {
    2.16 ++	while (src_stream && lines_count) {
    2.17 + 		char *line;
    2.18 + 		line = xmalloc_fgets(src_stream);
    2.19 + 		if (line == NULL) {
    2.20 +@@ -37,10 +35,9 @@
    2.21 + 			bb_perror_msg_and_die("error writing to new file");
    2.22 + 		}
    2.23 + 		free(line);
    2.24 +-
    2.25 +-		i++;
    2.26 ++		lines_count--;
    2.27 + 	}
    2.28 +-	return i;
    2.29 ++	return lines_count;
    2.30 + }
    2.31 + 
    2.32 + /* If patch_level is -1 it will remove all directory names
    2.33 +@@ -49,26 +46,24 @@
    2.34 +  * returns malloc'ed filename
    2.35 +  */
    2.36 + 
    2.37 +-static char *extract_filename(char *line, int patch_level)
    2.38 ++static char *extract_filename(char *line, unsigned int patch_level)
    2.39 + {
    2.40 + 	char *temp, *filename_start_ptr = line + 4;
    2.41 +-	int i;
    2.42 + 
    2.43 + 	/* Terminate string at end of source filename */
    2.44 +-	temp = strchrnul(filename_start_ptr, '\t');
    2.45 +-	*temp = '\0';
    2.46 ++	line[strcspn(line,"\t\n")] = '\0';
    2.47 + 
    2.48 + 	/* Skip over (patch_level) number of leading directories */
    2.49 +-	if (patch_level == -1)
    2.50 +-		patch_level = INT_MAX;
    2.51 +-	for (i = 0; i < patch_level; i++) {
    2.52 ++	while (patch_level--) {
    2.53 + 		temp = strchr(filename_start_ptr, '/');
    2.54 + 		if (!temp)
    2.55 + 			break;
    2.56 + 		filename_start_ptr = temp + 1;
    2.57 + 	}
    2.58 + 
    2.59 +-	return xstrdup(filename_start_ptr);
    2.60 ++	temp = xstrdup(filename_start_ptr);
    2.61 ++	free(line);
    2.62 ++	return temp;
    2.63 + }
    2.64 + 
    2.65 + static int file_doesnt_exist(const char *filename)
    2.66 +@@ -82,22 +77,19 @@
    2.67 + {
    2.68 + 	int patch_level = -1;
    2.69 + 	char *patch_line;
    2.70 +-	int ret;
    2.71 +-	FILE *patch_file = NULL;
    2.72 ++	FILE *patch_file = stdin;
    2.73 + 
    2.74 + 	{
    2.75 + 		char *p, *i;
    2.76 +-		ret = getopt32(argv, "p:i:", &p, &i);
    2.77 ++		int ret = getopt32(argv, "p:i:", &p, &i);
    2.78 + 		if (ret & 1)
    2.79 + 			patch_level = xatol_range(p, -1, USHRT_MAX);
    2.80 + 		if (ret & 2) {
    2.81 + 			patch_file = xfopen(i, "r");
    2.82 +-		} else {
    2.83 +-			patch_file = stdin;
    2.84 + 		}
    2.85 +-		ret = 0;
    2.86 + 	}
    2.87 + 
    2.88 ++	xfunc_error_retval = 2;
    2.89 + 	patch_line = xmalloc_getline(patch_file);
    2.90 + 	while (patch_line) {
    2.91 + 		FILE *src_stream;
    2.92 +@@ -122,18 +114,14 @@
    2.93 + 		/* FIXME: patch_line NULL check?? */
    2.94 + 
    2.95 + 		/* Extract the filename used before the patch was generated */
    2.96 +-		original_filename = extract_filename(patch_line, patch_level);
    2.97 +-		free(patch_line);
    2.98 ++		original_filename = extract_filename(patch_line, (unsigned int) patch_level);
    2.99 + 
   2.100 + 		patch_line = xmalloc_getline(patch_file);
   2.101 + 		/* FIXME: NULL check?? */
   2.102 + 		if (strncmp(patch_line, "+++ ", 4) != 0) {
   2.103 +-			ret = 2;
   2.104 +-			bb_error_msg("invalid patch");
   2.105 +-			continue;
   2.106 ++			bb_error_msg_and_die("invalid patch: %s\n",patch_line);
   2.107 + 		}
   2.108 +-		new_filename = extract_filename(patch_line, patch_level);
   2.109 +-		free(patch_line);
   2.110 ++		new_filename = extract_filename(patch_line, (unsigned int) patch_level);
   2.111 + 
   2.112 + 		if (file_doesnt_exist(new_filename)) {
   2.113 + 			char *line_ptr;
   2.114 +@@ -144,7 +132,6 @@
   2.115 + 				bb_make_directory(new_filename, -1, FILEUTILS_RECUR);
   2.116 + 				*line_ptr = '/';
   2.117 + 			}
   2.118 +-			dst_stream = xfopen(new_filename, "w+");
   2.119 + 			backup_filename = NULL;
   2.120 + 		} else {
   2.121 + 			backup_filename = xmalloc(strlen(new_filename) + 6);
   2.122 +@@ -154,12 +141,11 @@
   2.123 + 				bb_perror_msg_and_die("cannot create file %s",
   2.124 + 						backup_filename);
   2.125 + 			}
   2.126 +-			dst_stream = xfopen(new_filename, "w");
   2.127 + 		}
   2.128 + 
   2.129 +-		if ((backup_filename == NULL) || file_doesnt_exist(original_filename)) {
   2.130 +-			src_stream = NULL;
   2.131 +-		} else {
   2.132 ++ 		dst_stream = xfopen(new_filename, "w");
   2.133 ++ 		src_stream = NULL;
   2.134 ++ 		if (!file_doesnt_exist(original_filename)) {
   2.135 + 			if (strcmp(original_filename, new_filename) == 0) {
   2.136 + 				src_stream = xfopen(backup_filename, "r");
   2.137 + 			} else {
   2.138 +@@ -174,54 +160,59 @@
   2.139 + 		while (patch_line) {
   2.140 + 			unsigned int count;
   2.141 + 			unsigned int src_beg_line;
   2.142 ++			unsigned int src_last_line = 1;
   2.143 + 			unsigned int unused;
   2.144 + 			unsigned int hunk_offset_start = 0;
   2.145 +-			int hunk_error = 0;
   2.146 + 
   2.147 + 			/* This bit should be improved */
   2.148 +-			if ((sscanf(patch_line, "@@ -%d,%d +%d,%d @@", &src_beg_line, &unused, &dest_beg_line, &unused) != 4) &&
   2.149 +-				(sscanf(patch_line, "@@ -%d,%d +%d @@", &src_beg_line, &unused, &dest_beg_line) != 3) &&
   2.150 +-				(sscanf(patch_line, "@@ -%d +%d,%d @@", &src_beg_line, &dest_beg_line, &unused) != 3)) {
   2.151 ++			if ((sscanf(patch_line, "@@ -%d,%d +%d,%d @@", &src_beg_line, 
   2.152 ++						&src_last_line, &dest_beg_line, &unused) != 4) &&
   2.153 ++				(sscanf(patch_line, "@@ -%d,%d +%d @@", &src_beg_line, 
   2.154 ++						&src_last_line, &dest_beg_line) != 3) &&
   2.155 ++				(sscanf(patch_line, "@@ -%d +%d,%d @@", &src_beg_line,
   2.156 ++						&dest_beg_line, &unused) != 3) &&
   2.157 ++				(sscanf(patch_line, "@@ -%d +%d @@", &src_beg_line,
   2.158 ++						&dest_beg_line) != 2)) {
   2.159 + 				/* No more hunks for this file */
   2.160 + 				break;
   2.161 + 			}
   2.162 +-			free(patch_line);
   2.163 + 			hunk_count++;
   2.164 + 
   2.165 + 			if (src_beg_line && dest_beg_line) {
   2.166 + 				/* Copy unmodified lines upto start of hunk */
   2.167 + 				/* src_beg_line will be 0 if its a new file */
   2.168 + 				count = src_beg_line - src_cur_line;
   2.169 +-				if (copy_lines(src_stream, dst_stream, count) != count) {
   2.170 ++				if (copy_lines(src_stream, dst_stream, count)) {
   2.171 + 					bb_error_msg_and_die("bad src file");
   2.172 + 				}
   2.173 + 				src_cur_line += count;
   2.174 + 				dest_cur_line += count;
   2.175 + 				copy_trailing_lines_flag = 1;
   2.176 + 			}
   2.177 +-			hunk_offset_start = src_cur_line;
   2.178 ++			src_last_line += hunk_offset_start = src_cur_line;
   2.179 + 
   2.180 +-			while ((patch_line = xmalloc_fgets(patch_file)) != NULL) {
   2.181 ++			for (free(patch_line); 
   2.182 ++				 (patch_line = xmalloc_fgets(patch_file)) != NULL;
   2.183 ++				 free(patch_line)) {
   2.184 + 				if ((*patch_line == '-') || (*patch_line == ' ')) {
   2.185 + 					char *src_line = NULL;
   2.186 ++					if (src_cur_line == src_last_line) break;
   2.187 + 					if (src_stream) {
   2.188 + 						src_line = xmalloc_fgets(src_stream);
   2.189 +-						if (!src_line) {
   2.190 +-							hunk_error++;
   2.191 +-							break;
   2.192 +-						} else {
   2.193 ++						if (src_line) {
   2.194 ++							int diff = strcmp(src_line, patch_line + 1);
   2.195 + 							src_cur_line++;
   2.196 ++							free(src_line);
   2.197 ++							if (diff) {
   2.198 ++								src_line = NULL;
   2.199 ++							}
   2.200 + 						}
   2.201 +-						if (strcmp(src_line, patch_line + 1) != 0) {
   2.202 +-							bb_error_msg("hunk #%d FAILED at %d", hunk_count, hunk_offset_start);
   2.203 +-							hunk_error++;
   2.204 +-							free(patch_line);
   2.205 +-							/* Probably need to find next hunk, etc... */
   2.206 +-							/* but for now we just bail out */
   2.207 +-							patch_line = NULL;
   2.208 ++						if (!src_line) {
   2.209 ++							bb_error_msg("hunk #%d FAILED at %d",
   2.210 ++										 hunk_count, hunk_offset_start);
   2.211 ++							bad_hunk_count++;
   2.212 + 							break;
   2.213 + 						}
   2.214 +-						free(src_line);
   2.215 + 					}
   2.216 + 					if (*patch_line == ' ') {
   2.217 + 						fputs(patch_line + 1, dst_stream);
   2.218 +@@ -233,16 +224,12 @@
   2.219 + 				} else {
   2.220 + 					break;
   2.221 + 				}
   2.222 +-				free(patch_line);
   2.223 +-			}
   2.224 +-			if (hunk_error) {
   2.225 +-				bad_hunk_count++;
   2.226 + 			}
   2.227 + 		}
   2.228 + 
   2.229 + 		/* Cleanup last patched file */
   2.230 + 		if (copy_trailing_lines_flag) {
   2.231 +-			copy_lines(src_stream, dst_stream, -1);
   2.232 ++			copy_lines(src_stream, dst_stream, (unsigned int) -1);
   2.233 + 		}
   2.234 + 		if (src_stream) {
   2.235 + 			fclose(src_stream);
   2.236 +@@ -251,16 +238,14 @@
   2.237 + 			fclose(dst_stream);
   2.238 + 		}
   2.239 + 		if (bad_hunk_count) {
   2.240 +-			if (!ret) {
   2.241 +-				ret = 1;
   2.242 +-			}
   2.243 + 			bb_error_msg("%d out of %d hunk FAILED", bad_hunk_count, hunk_count);
   2.244 ++			return 1;
   2.245 + 		} else {
   2.246 + 			/* It worked, we can remove the backup */
   2.247 + 			if (backup_filename) {
   2.248 + 				unlink(backup_filename);
   2.249 + 			}
   2.250 +-			if ((dest_cur_line == 0) || (dest_beg_line == 0)) {
   2.251 ++			if (dest_cur_line == 0) {
   2.252 + 				/* The new patched file is empty, remove it */
   2.253 + 				xunlink(new_filename);
   2.254 + 				if (strcmp(new_filename, original_filename) != 0)
   2.255 +@@ -273,5 +258,5 @@
   2.256 + 	 * 1 = Some hunks failed
   2.257 + 	 * 2 = More serious problems
   2.258 + 	 */
   2.259 +-	return ret;
   2.260 ++	return 0;
   2.261 + }
     3.1 --- a/busybox/stuff/busybox-1.7.3-script.u	Wed Feb 27 16:38:56 2008 +0100
     3.2 +++ b/busybox/stuff/busybox-1.7.3-script.u	Thu Feb 28 12:30:56 2008 +0000
     3.3 @@ -355,4 +355,3 @@
     3.4  +
     3.5   #define sed_trivial_usage \
     3.6          "[-efinr] pattern [files...]"
     3.7 -patch bug...