Hi,

The problem relies in the parser code: it relies on the fact that "char" 
are unsigned which is untrue on PPC.

Attached is a patch that fixes the following in the parser:
  * Buffer overflow for any string longer than 500 chars.
  * Errors appearing on PowerPC.
  * Some warnings.

Please note that the package cointains "parser.c" which can be generated 
from "parser.y". Removing "parser.c" would add a Build-Depends on 
bison, though.

Cheers,
Jérémy.
--- ../labplot-1.4.0/src/parser.y	2004-02-02 01:07:34.000000000 +0100
+++ src/parser.y	2005-02-14 13:45:12.000000000 +0100
@@ -49,15 +49,14 @@
 symrec *sym_table = (symrec *) 0;
 
 double parse(char *str) {
-	int i;
 	pos=0;
 
 	/* reset string, because it's global !	*/
-	for (i=0;i<500;i++) 
-		string[i]=EOF;
+	bzero(string, PARSE_STRING_SIZE);
 
-	strcpy(string,str);
-	string[strlen(str)]='\n';
+	/* leave space to terminate string by "\n\0" */
+	strncpy(string, str, PARSE_STRING_SIZE - 2);
+	string[strlen(string)] = '\n';
 	init_table();
 	yyparse();
 	
@@ -114,9 +113,9 @@
 }
 
 static int getcharstr(void) {
-    if (pos >= strlen(string))
+    if ('\0' == string[pos])
          return EOF;
-    return (string[pos++]);
+    return (int) string[pos++];
 }
  
 static void ungetcstr(void) {
--- ../labplot-1.4.0/src/parser.h	2004-02-02 01:06:37.000000000 +0100
+++ src/parser.h	2005-02-14 13:32:09.000000000 +0100
@@ -46,18 +46,21 @@
 
 typedef struct symrec symrec;
 
-symrec *putsym (const char *,int  func_t);
+double parse(char *str);
+symrec *putsym (const char *, int);
 symrec *getsym (const char *);
 void init_table(void);
 int yyerror (const char*);
-int yylex ();
+int yylex(void);
+
+#define PARSE_STRING_SIZE       500
 
 double res;
 int pos;
-char string[500];
+unsigned char string[PARSE_STRING_SIZE];
  
 struct init {
-	char *fname;
+	char const *fname;
 #ifdef USE_SOLARIS 
 	double (*fnct)(double);
 #else
@@ -66,7 +69,7 @@
 };
 
 struct con {
-	char *name;
+	char const *name;
 	double value;
 };
 

Attachment: pgpCgeSAXl0mB.pgp
Description: PGP signature

Reply via email to