mirror of
				https://github.com/Cisco-Talos/clamav.git
				synced 2025-10-31 16:10:54 +00:00 
			
		
		
		
	Handle boundary= "foo"
git-svn: trunk@821
This commit is contained in:
		
							parent
							
								
									335d166377
								
							
						
					
					
						commit
						28010d29e4
					
				
					 3 changed files with 87 additions and 169 deletions
				
			
		|  | @ -1,3 +1,9 @@ | ||||||
|  | Fri Sep  3 17:00:28 BST 2004 (njh) | ||||||
|  | ---------------------------------- | ||||||
|  |   * libclamav:	Handle spaces in headers such as 'boundary= "foo"'. I believe | ||||||
|  | 			that the space on the RHS of the = is not RFC1521, | ||||||
|  | 			but Outlook Express generates them | ||||||
|  | 
 | ||||||
| Wed Sep  1 16:11:40 CEST 2004 (tk) | Wed Sep  1 16:11:40 CEST 2004 (tk) | ||||||
| ---------------------------------- | ---------------------------------- | ||||||
|   * libclamav: replace current MD5 implementation with another one |   * libclamav: replace current MD5 implementation with another one | ||||||
|  |  | ||||||
|  | @ -17,6 +17,9 @@ | ||||||
|  * |  * | ||||||
|  * Change History: |  * Change History: | ||||||
|  * $Log: mbox.c,v $ |  * $Log: mbox.c,v $ | ||||||
|  |  * Revision 1.114  2004/09/03 15:59:00  nigelhorne | ||||||
|  |  * Handle boundary= "foo" | ||||||
|  |  * | ||||||
|  * Revision 1.113  2004/08/26 09:33:20  nigelhorne |  * Revision 1.113  2004/08/26 09:33:20  nigelhorne | ||||||
|  * Scan Communigate Pro files |  * Scan Communigate Pro files | ||||||
|  * |  * | ||||||
|  | @ -327,7 +330,7 @@ | ||||||
|  * Compilable under SCO; removed duplicate code with message.c |  * Compilable under SCO; removed duplicate code with message.c | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| static	char	const	rcsid[] = "$Id: mbox.c,v 1.113 2004/08/26 09:33:20 nigelhorne Exp $"; | static	char	const	rcsid[] = "$Id: mbox.c,v 1.114 2004/09/03 15:59:00 nigelhorne Exp $"; | ||||||
| 
 | 
 | ||||||
| #if HAVE_CONFIG_H | #if HAVE_CONFIG_H | ||||||
| #include "clamav-config.h" | #include "clamav-config.h" | ||||||
|  | @ -439,9 +442,6 @@ static	size_t	strip(char *buf, int len); | ||||||
| static	bool	continuationMarker(const char *line); | static	bool	continuationMarker(const char *line); | ||||||
| static	int	parseMimeHeader(message *m, const char *cmd, const table_t *rfc821Table, const char *arg); | static	int	parseMimeHeader(message *m, const char *cmd, const table_t *rfc821Table, const char *arg); | ||||||
| static	void	saveTextPart(message *m, const char *dir); | static	void	saveTextPart(message *m, const char *dir); | ||||||
| #if	0 |  | ||||||
| static	bool	saveFile(const blob *b, const char *dir); |  | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
| static	void	checkURLs(message *m, const char *dir); | static	void	checkURLs(message *m, const char *dir); | ||||||
| #ifdef	WITH_CURL | #ifdef	WITH_CURL | ||||||
|  | @ -746,6 +746,7 @@ parseEmailHeaders(const message *m, const table_t *rfc821) | ||||||
| 	const text *t; | 	const text *t; | ||||||
| 	message *ret; | 	message *ret; | ||||||
| 	bool anyHeadersFound = FALSE; | 	bool anyHeadersFound = FALSE; | ||||||
|  | 	bool Xheader = FALSE; | ||||||
| 
 | 
 | ||||||
| 	cli_dbgmsg("parseEmailHeaders\n"); | 	cli_dbgmsg("parseEmailHeaders\n"); | ||||||
| 
 | 
 | ||||||
|  | @ -765,30 +766,31 @@ parseEmailHeaders(const message *m, const table_t *rfc821) | ||||||
| 		else | 		else | ||||||
| 			buffer = NULL; | 			buffer = NULL; | ||||||
| 
 | 
 | ||||||
|  | 		if(inHeader) { | ||||||
|  | 			if(buffer == NULL) { | ||||||
|  | 				/*
 | ||||||
|  | 				 * A blank line signifies the end of the header | ||||||
|  | 				 * and the start of the text | ||||||
|  | 				 */ | ||||||
|  | 				cli_dbgmsg("End of header information\n"); | ||||||
|  | 				inHeader = FALSE; | ||||||
|  | 			} else if(((buffer[0] == '\t') || (buffer[0] == ' ')) && | ||||||
|  | 				  (!Xheader)) { | ||||||
| 				/*
 | 				/*
 | ||||||
| 				 * Section B.2 of RFC822 says TAB or SPACE means | 				 * Section B.2 of RFC822 says TAB or SPACE means | ||||||
| 				 * a continuation of the previous entry. | 				 * a continuation of the previous entry. | ||||||
| 		 */ | 				 * | ||||||
| 		if(inHeader && buffer && |  | ||||||
| 		  ((buffer[0] == '\t') || (buffer[0] == ' '))) { |  | ||||||
| 			/*
 |  | ||||||
| 				 * Add all the arguments on the line | 				 * Add all the arguments on the line | ||||||
| 				 */ | 				 */ | ||||||
| 				const char *ptr; | 				const char *ptr; | ||||||
| 				char *copy = strdup(buffer); | 				char *copy = strdup(buffer); | ||||||
| 
 | 
 | ||||||
| 				for(ptr = strtok_r(copy, ";", &strptr); ptr; ptr = strtok_r(NULL, ":", &strptr)) | 				for(ptr = strtok_r(copy, ";", &strptr); ptr; ptr = strtok_r(NULL, ":", &strptr)) | ||||||
| 				messageAddArgument(ret, ptr); | 					if(strchr(ptr, '=')) | ||||||
|  | 						messageAddArguments(ret, ptr); | ||||||
| 				free(copy); | 				free(copy); | ||||||
| 		} else if(inHeader) { |  | ||||||
| 			/*
 |  | ||||||
| 			 * A blank line signifies the end of the header and |  | ||||||
| 			 * the start of the text |  | ||||||
| 			 */ |  | ||||||
| 			if(buffer == NULL) { |  | ||||||
| 				cli_dbgmsg("End of header information\n"); |  | ||||||
| 				inHeader = FALSE; |  | ||||||
| 			} else { | 			} else { | ||||||
|  | 				Xheader = (bool)(buffer[0] == 'X'); | ||||||
| 				if((parseEmailHeader(ret, buffer, rfc821) >= 0) || | 				if((parseEmailHeader(ret, buffer, rfc821) >= 0) || | ||||||
| 				   (strncasecmp(buffer, "From ", 5) == 0)) | 				   (strncasecmp(buffer, "From ", 5) == 0)) | ||||||
| 					anyHeadersFound = TRUE; | 					anyHeadersFound = TRUE; | ||||||
|  | @ -973,7 +975,7 @@ parseEmailBody(message *messageIn, text *textIn, const char *dir, const table_t | ||||||
| 			while((t_line = t_line->t_next) != NULL); | 			while((t_line = t_line->t_next) != NULL); | ||||||
| 
 | 
 | ||||||
| 			if(t_line == NULL) { | 			if(t_line == NULL) { | ||||||
| 				cli_warnmsg("Multipart MIME message contains no boundary lines\n"); | 				cli_dbgmsg("Multipart MIME message contains no boundary lines\n"); | ||||||
| 				/*
 | 				/*
 | ||||||
| 				 * Free added by Thomas Lamy | 				 * Free added by Thomas Lamy | ||||||
| 				 * <Thomas.Lamy@in-online.net> | 				 * <Thomas.Lamy@in-online.net> | ||||||
|  | @ -1389,7 +1391,7 @@ parseEmailBody(message *messageIn, text *textIn, const char *dir, const table_t | ||||||
| 								addAttachment = TRUE; | 								addAttachment = TRUE; | ||||||
| 							} | 							} | ||||||
| 						} else { | 						} else { | ||||||
| 							cli_warnmsg("Text type %s is not supported\n", dtype); | 							cli_dbgmsg("Text type %s is not supported\n", dtype); | ||||||
| 							continue; | 							continue; | ||||||
| 						} | 						} | ||||||
| 						break; | 						break; | ||||||
|  | @ -1870,18 +1872,17 @@ static int | ||||||
| getTextPart(message *const messages[], size_t size) | getTextPart(message *const messages[], size_t size) | ||||||
| { | { | ||||||
| 	size_t i; | 	size_t i; | ||||||
|  | 	int textpart = -1; | ||||||
| 
 | 
 | ||||||
| 	for(i = 0; i < size; i++) { | 	for(i = 0; i < size; i++) { | ||||||
| 		assert(messages[i] != NULL); | 		assert(messages[i] != NULL); | ||||||
| 		if((messageGetMimeType(messages[i]) == TEXT) && | 		if(messageGetMimeType(messages[i]) == TEXT) { | ||||||
| 		   (strcasecmp(messageGetMimeSubtype(messages[i]), "html") == 0)) | 			if(strcasecmp(messageGetMimeSubtype(messages[i]), "html") == 0) | ||||||
| 				return (int)i; | 				return (int)i; | ||||||
|  | 			textpart = (int)i; | ||||||
| 		} | 		} | ||||||
| 	for(i = 0; i < size; i++) | 	} | ||||||
| 		if(messageGetMimeType(messages[i]) == TEXT) | 	return textpart; | ||||||
| 			return (int)i; |  | ||||||
| 
 |  | ||||||
| 	return -1; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | @ -1981,11 +1982,10 @@ continuationMarker(const char *line) | ||||||
| static int | static int | ||||||
| parseMimeHeader(message *m, const char *cmd, const table_t *rfc821Table, const char *arg) | parseMimeHeader(message *m, const char *cmd, const table_t *rfc821Table, const char *arg) | ||||||
| { | { | ||||||
| 	const int type = tableFind(rfc821Table, cmd); |  | ||||||
| #ifdef CL_THREAD_SAFE | #ifdef CL_THREAD_SAFE | ||||||
| 	char *strptr; | 	char *strptr; | ||||||
| #endif | #endif | ||||||
| 	char *copy = strdup(arg); | 	char *copy = strdup(arg ? arg : ""); | ||||||
| 	char *ptr = copy; | 	char *ptr = copy; | ||||||
| 
 | 
 | ||||||
| 	if(copy == NULL) | 	if(copy == NULL) | ||||||
|  | @ -1994,7 +1994,7 @@ parseMimeHeader(message *m, const char *cmd, const table_t *rfc821Table, const c | ||||||
| 	cli_dbgmsg("parseMimeHeader: cmd='%s', arg='%s'\n", cmd, arg); | 	cli_dbgmsg("parseMimeHeader: cmd='%s', arg='%s'\n", cmd, arg); | ||||||
| 	strstrip(copy); | 	strstrip(copy); | ||||||
| 
 | 
 | ||||||
| 	switch(type) { | 	switch(tableFind(rfc821Table, cmd)) { | ||||||
| 		case CONTENT_TYPE: | 		case CONTENT_TYPE: | ||||||
| 			/*
 | 			/*
 | ||||||
| 			 * Fix for non RFC1521 compliant mailers | 			 * Fix for non RFC1521 compliant mailers | ||||||
|  | @ -2020,7 +2020,7 @@ parseMimeHeader(message *m, const char *cmd, const table_t *rfc821Table, const c | ||||||
| 				 * which I believe is illegal according to | 				 * which I believe is illegal according to | ||||||
| 				 * RFC1521 | 				 * RFC1521 | ||||||
| 				 */ | 				 */ | ||||||
| 				cli_warnmsg("Invalid content-type '%s' received, no subtype specified, assuming text/plain; charset=us-ascii\n", copy); | 				cli_dbgmsg("Invalid content-type '%s' received, no subtype specified, assuming text/plain; charset=us-ascii\n", copy); | ||||||
| 			else { | 			else { | ||||||
| 				/*
 | 				/*
 | ||||||
| 				 * Some clients are broken and | 				 * Some clients are broken and | ||||||
|  | @ -2093,108 +2093,6 @@ saveTextPart(message *m, const char *dir) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #if	0 |  | ||||||
| /*
 |  | ||||||
|  * Save some data as a unique file in the given directory. |  | ||||||
|  * |  | ||||||
|  * TODO: don't save archive files if archive scanning is disabled, or |  | ||||||
|  *	OLE2 files if that is disabled or pattern match --exclude, but |  | ||||||
|  *	we need access to the command line options/clamav.conf here to |  | ||||||
|  *	be able to do that |  | ||||||
|  * |  | ||||||
|  * FIXME: duplicated code with fileblobSetFilename() |  | ||||||
|  */ |  | ||||||
| static bool |  | ||||||
| saveFile(const blob *b, const char *dir) |  | ||||||
| { |  | ||||||
| 	const unsigned long nbytes = blobGetDataSize(b); |  | ||||||
| 	size_t suffixLen = 0; |  | ||||||
| 	int fd; |  | ||||||
| 	const char *cptr, *suffix; |  | ||||||
| 	char filename[NAME_MAX + 1]; |  | ||||||
| 
 |  | ||||||
| 	assert(dir != NULL); |  | ||||||
| 
 |  | ||||||
| 	if(nbytes == 0) |  | ||||||
| 		return TRUE; |  | ||||||
| 
 |  | ||||||
| 	cptr = blobGetFilename(b); |  | ||||||
| 
 |  | ||||||
| 	if(cptr == NULL) { |  | ||||||
| 		cptr = "unknown"; |  | ||||||
| 		suffix = ""; |  | ||||||
| 	} else { |  | ||||||
| 		/*
 |  | ||||||
| 		 * Some programs are broken and use an idea of a ".suffix" |  | ||||||
| 		 * to determine the file type rather than looking up the |  | ||||||
| 		 * magic number. CPM has a lot to answer for... |  | ||||||
| 		 * FIXME: the suffix now appears twice in the filename... |  | ||||||
| 		 */ |  | ||||||
| 		suffix = strrchr(cptr, '.'); |  | ||||||
| 		if(suffix == NULL) |  | ||||||
| 			suffix = ""; |  | ||||||
| 		else { |  | ||||||
| 			suffixLen = strlen(suffix); |  | ||||||
| 			if(suffixLen > 4) { |  | ||||||
| 				/* Found a full stop which isn't a suffix */ |  | ||||||
| 				suffix = ""; |  | ||||||
| 				suffixLen = 0; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	cli_dbgmsg("Saving attachment in %s/%s\n", dir, cptr); |  | ||||||
| 
 |  | ||||||
| 	/*
 |  | ||||||
| 	 * Allow for very long filenames. We have to truncate them to fit |  | ||||||
| 	 */ |  | ||||||
| 	snprintf(filename, sizeof(filename) - 1 - suffixLen, "%s/%.*sXXXXXX", dir, |  | ||||||
| 		(int)(sizeof(filename) - 9 - suffixLen - strlen(dir)), cptr); |  | ||||||
| 
 |  | ||||||
| 	/*
 |  | ||||||
| 	 * TODO: add a HAVE_MKSTEMP property |  | ||||||
| 	 */ |  | ||||||
| #if	defined(C_LINUX) || defined(C_BSD) || defined(HAVE_MKSTEMP) || defined(C_SOLARIS) || defined(C_CYGWIN) |  | ||||||
| 	fd = mkstemp(filename); |  | ||||||
| #else |  | ||||||
| 	(void)mktemp(filename); |  | ||||||
| 	fd = open(filename, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_BINARY, 0600); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 	if(fd < 0) { |  | ||||||
| 		cli_errmsg("Can't create temporary file %s: %s\n", filename, strerror(errno)); |  | ||||||
| 		cli_dbgmsg("%lu %d %d\n", suffixLen, sizeof(filename), strlen(filename)); |  | ||||||
| 		return FALSE; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/*
 |  | ||||||
| 	 * Add the suffix back to the end of the filename. Tut-tut, filenames |  | ||||||
| 	 * should be independant of their usage on UNIX type systems. |  | ||||||
| 	 */ |  | ||||||
| 	if(suffixLen > 1) { |  | ||||||
| 		char stub[NAME_MAX + 1]; |  | ||||||
| 
 |  | ||||||
| 		snprintf(stub, sizeof(stub), "%s%s", filename, suffix); |  | ||||||
| #ifdef	C_LINUX |  | ||||||
| 		rename(stub, filename); |  | ||||||
| #else |  | ||||||
| 		link(stub, filename); |  | ||||||
| 		unlink(stub); |  | ||||||
| #endif |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	cli_dbgmsg("Saving attachment as %s (%lu bytes long)\n", |  | ||||||
| 		filename, nbytes); |  | ||||||
| 
 |  | ||||||
| 	if(cli_writen(fd, blobGetData(b), (size_t)nbytes) != nbytes) { |  | ||||||
| 		perror(filename); |  | ||||||
| 		close(fd); |  | ||||||
| 		return FALSE; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return (close(fd) >= 0); |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #ifdef	FOLLOWURLS | #ifdef	FOLLOWURLS | ||||||
| static void | static void | ||||||
| checkURLs(message *m, const char *dir) | checkURLs(message *m, const char *dir) | ||||||
|  |  | ||||||
|  | @ -17,6 +17,9 @@ | ||||||
|  * |  * | ||||||
|  * Change History: |  * Change History: | ||||||
|  * $Log: message.c,v $ |  * $Log: message.c,v $ | ||||||
|  |  * Revision 1.76  2004/09/03 15:59:00  nigelhorne | ||||||
|  |  * Handle boundary= "foo" | ||||||
|  |  * | ||||||
|  * Revision 1.75  2004/08/23 13:15:16  nigelhorne |  * Revision 1.75  2004/08/23 13:15:16  nigelhorne | ||||||
|  * messageClearMarkers |  * messageClearMarkers | ||||||
|  * |  * | ||||||
|  | @ -222,7 +225,7 @@ | ||||||
|  * uuencodebegin() no longer static |  * uuencodebegin() no longer static | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| static	char	const	rcsid[] = "$Id: message.c,v 1.75 2004/08/23 13:15:16 nigelhorne Exp $"; | static	char	const	rcsid[] = "$Id: message.c,v 1.76 2004/09/03 15:59:00 nigelhorne Exp $"; | ||||||
| 
 | 
 | ||||||
| #if HAVE_CONFIG_H | #if HAVE_CONFIG_H | ||||||
| #include "clamav-config.h" | #include "clamav-config.h" | ||||||
|  | @ -282,6 +285,7 @@ static	unsigned	char	base64(char c); | ||||||
| static	unsigned	char	uudecode(char c); | static	unsigned	char	uudecode(char c); | ||||||
| static	const	char	*messageGetArgument(const message *m, int arg); | static	const	char	*messageGetArgument(const message *m, int arg); | ||||||
| static	void	*messageExport(message *m, const char *dir, void *(*create)(void), void (*destroy)(void *), void (*setFilename)(void *, const char *, const char *), void (*addData)(void *, const unsigned char *, size_t), void *(*exportText)(const text *, void *)); | static	void	*messageExport(message *m, const char *dir, void *(*create)(void), void (*destroy)(void *), void (*setFilename)(void *, const char *, const char *), void (*addData)(void *, const unsigned char *, size_t), void *(*exportText)(const text *, void *)); | ||||||
|  | static	int	usefulArg(const char *arg); | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * These maps are ordered in decreasing likelyhood of their appearance |  * These maps are ordered in decreasing likelyhood of their appearance | ||||||
|  | @ -523,20 +527,8 @@ messageAddArgument(message *m, const char *arg) | ||||||
| 		/* Empty argument? Probably a broken mail client... */ | 		/* Empty argument? Probably a broken mail client... */ | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	if(!usefulArg(arg)) | ||||||
| 	 * These are the only arguments we're interested in. |  | ||||||
| 	 * Do 'fgrep messageFindArgument *.c' if you don't believe me! |  | ||||||
| 	 * It's probably not good doing this since each time a new |  | ||||||
| 	 * messageFindArgument is added I need to remember to look here, |  | ||||||
| 	 * but it can save a lot of memory... |  | ||||||
| 	 */ |  | ||||||
| 	if((strncasecmp(arg, "name", 4) != 0) && |  | ||||||
| 	   (strncasecmp(arg, "filename", 8) != 0) && |  | ||||||
| 	   (strncasecmp(arg, "boundary", 8) != 0) && |  | ||||||
| 	   (strncasecmp(arg, "type", 4) != 0)) { |  | ||||||
| 		cli_dbgmsg("Discarding unwanted argument '%s'\n", arg); |  | ||||||
| 		return; | 		return; | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	cli_dbgmsg("Add argument '%s'\n", arg); | 	cli_dbgmsg("Add argument '%s'\n", arg); | ||||||
| 
 | 
 | ||||||
|  | @ -598,6 +590,7 @@ messageAddArguments(message *m, const char *s) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		key = string; | 		key = string; | ||||||
|  | 
 | ||||||
| 		data = strchr(string, '='); | 		data = strchr(string, '='); | ||||||
| 
 | 
 | ||||||
| 		/*
 | 		/*
 | ||||||
|  | @ -618,8 +611,7 @@ messageAddArguments(message *m, const char *s) | ||||||
| 			/*
 | 			/*
 | ||||||
| 			 * Completely broken, give up | 			 * Completely broken, give up | ||||||
| 			 */ | 			 */ | ||||||
| 			cli_warnmsg("Can't parse non RFC1521 header \"%s\"\n", | 			cli_dbgmsg("Can't parse header \"%s\"\n", s); | ||||||
| 				s); |  | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -629,6 +621,12 @@ messageAddArguments(message *m, const char *s) | ||||||
| 
 | 
 | ||||||
| 		/*
 | 		/*
 | ||||||
| 		 * Handle white space to the right of the equals sign | 		 * Handle white space to the right of the equals sign | ||||||
|  | 		 * This breaks RFC1521 which has: | ||||||
|  | 		 *	parameter := attribute "=" value | ||||||
|  | 		 *	attribute := token   ; case-insensitive | ||||||
|  | 		 *	token  :=  1*<any (ASCII) CHAR except SPACE, CTLs, | ||||||
|  | 		 *		or tspecials> | ||||||
|  | 		 * But too many MUAs ignore this | ||||||
| 		 */ | 		 */ | ||||||
| 		while(isspace(*string) && (*string != '\0')) | 		while(isspace(*string) && (*string != '\0')) | ||||||
| 			string++; | 			string++; | ||||||
|  | @ -651,14 +649,21 @@ messageAddArguments(message *m, const char *s) | ||||||
| 			cptr++; | 			cptr++; | ||||||
| 
 | 
 | ||||||
| 			string = strchr(cptr, '"'); | 			string = strchr(cptr, '"'); | ||||||
|  | 
 | ||||||
| 			if((string == NULL) || (strlen(key) == 0)) { | 			if((string == NULL) || (strlen(key) == 0)) { | ||||||
| 				cli_warnmsg("Can't parse header \"%s\"\n", s); | 				if(usefulArg(key)) | ||||||
|  | 					cli_warnmsg("Can't parse header (1) \"%s\"\n", s); | ||||||
| 				free((char *)key); | 				free((char *)key); | ||||||
| 				return; | 				return; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			string++; | 			string++; | ||||||
| 
 | 
 | ||||||
|  | 			if(!usefulArg(key)) { | ||||||
|  | 				free((char *)key); | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
| 			data = strdup(cptr); | 			data = strdup(cptr); | ||||||
| 
 | 
 | ||||||
| 			ptr = (data) ? strchr(data, '"') : NULL; | 			ptr = (data) ? strchr(data, '"') : NULL; | ||||||
|  | @ -674,7 +679,7 @@ messageAddArguments(message *m, const char *s) | ||||||
| 				 * TODO: the file should still be saved and | 				 * TODO: the file should still be saved and | ||||||
| 				 * virus checked | 				 * virus checked | ||||||
| 				 */ | 				 */ | ||||||
| 				cli_warnmsg("Can't parse header \"%s\"\n", s); | 				cli_warnmsg("Can't parse header (2) \"%s\"\n", s); | ||||||
| 				if(data) | 				if(data) | ||||||
| 					free(data); | 					free(data); | ||||||
| 				free((char *)key); | 				free((char *)key); | ||||||
|  | @ -683,14 +688,6 @@ messageAddArguments(message *m, const char *s) | ||||||
| 
 | 
 | ||||||
| 			*ptr = '\0'; | 			*ptr = '\0'; | ||||||
| 
 | 
 | ||||||
| #if	0 |  | ||||||
| 			field = cli_malloc(strlen(key) + strlen(data) + 2); |  | ||||||
| 			if(field) |  | ||||||
| 				sprintf(field, "%s=%s", key, data); |  | ||||||
| 
 |  | ||||||
| 			free((char *)key); |  | ||||||
| 			free(data); |  | ||||||
| #else |  | ||||||
| 			field = cli_realloc((char *)key, strlen(key) + strlen(data) + 2); | 			field = cli_realloc((char *)key, strlen(key) + strlen(data) + 2); | ||||||
| 			if(field) { | 			if(field) { | ||||||
| 				strcat(field, "="); | 				strcat(field, "="); | ||||||
|  | @ -698,7 +695,6 @@ messageAddArguments(message *m, const char *s) | ||||||
| 			} else | 			} else | ||||||
| 				free((char *)key); | 				free((char *)key); | ||||||
| 			free(data); | 			free(data); | ||||||
| #endif |  | ||||||
| 		} else { | 		} else { | ||||||
| 			size_t len; | 			size_t len; | ||||||
| 
 | 
 | ||||||
|  | @ -1392,7 +1388,6 @@ messageToFileblob(message *m, const char *dir) | ||||||
| /*
 | /*
 | ||||||
|  * Decode and transfer the contents of the message into a blob |  * Decode and transfer the contents of the message into a blob | ||||||
|  * The caller must free the returned blob |  * The caller must free the returned blob | ||||||
|  * TODO: a lot of code here is duplicated with messageToFileblob |  | ||||||
|  */ |  */ | ||||||
| blob * | blob * | ||||||
| messageToBlob(message *m) | messageToBlob(message *m) | ||||||
|  | @ -1876,7 +1871,6 @@ decode(message *m, const char *in, unsigned char *out, unsigned char (*decoder)( | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 		} else while(*in) { | 		} else while(*in) { | ||||||
| 		/* Slower decoding for last line */ |  | ||||||
| 			int nbytes; | 			int nbytes; | ||||||
| 
 | 
 | ||||||
| 			if(m->base64chars) { | 			if(m->base64chars) { | ||||||
|  | @ -1978,3 +1972,23 @@ uudecode(char c) | ||||||
| { | { | ||||||
| 	return(c - ' '); | 	return(c - ' '); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * These are the only arguments we're interested in. | ||||||
|  |  * Do 'fgrep messageFindArgument *.c' if you don't believe me! | ||||||
|  |  * It's probably not good doing this since each time a new | ||||||
|  |  * messageFindArgument is added I need to remember to look here, | ||||||
|  |  * but it can save a lot of memory... | ||||||
|  |  */ | ||||||
|  | static int | ||||||
|  | usefulArg(const char *arg) | ||||||
|  | { | ||||||
|  | 	if((strncasecmp(arg, "name", 4) != 0) && | ||||||
|  | 	   (strncasecmp(arg, "filename", 8) != 0) && | ||||||
|  | 	   (strncasecmp(arg, "boundary", 8) != 0) && | ||||||
|  | 	   (strncasecmp(arg, "type", 4) != 0)) { | ||||||
|  | 		cli_dbgmsg("Discarding unwanted argument '%s'\n", arg); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Nigel Horne
						Nigel Horne