e30c1c7
diff -up sqlite-3.6.6.2/tool/lemon.c.lemparpath sqlite-3.6.6.2/tool/lemon.c
e30c1c7
--- sqlite-3.6.6.2/tool/lemon.c.lemparpath	2008-12-05 20:37:49.000000000 +0200
e30c1c7
+++ sqlite-3.6.6.2/tool/lemon.c	2008-12-05 20:44:08.000000000 +0200
e30c1c7
@@ -1324,15 +1324,15 @@ void ErrorMsg(const char *filename, int 
e30c1c7
   va_start(ap, format);
e30c1c7
   /* Prepare a prefix to be prepended to every output line */
e30c1c7
   if( lineno>0 ){
e30c1c7
-    sprintf(prefix,"%.*s:%d: ",PREFIXLIMIT-10,filename,lineno);
e30c1c7
+    snprintf(prefix,sizeof prefix,"%.*s:%d: ",PREFIXLIMIT-10,filename,lineno);
e30c1c7
   }else{
e30c1c7
-    sprintf(prefix,"%.*s: ",PREFIXLIMIT-10,filename);
e30c1c7
+    snprintf(prefix,sizeof prefix,"%.*s: ",PREFIXLIMIT-10,filename);
e30c1c7
   }
e30c1c7
   prefixsize = lemonStrlen(prefix);
e30c1c7
   availablewidth = LINEWIDTH - prefixsize;
e30c1c7
 
e30c1c7
   /* Generate the error message */
e30c1c7
-  vsprintf(errmsg,format,ap);
e30c1c7
+  vsnprintf(errmsg,sizeof errmsg,format,ap);
e30c1c7
   va_end(ap);
e30c1c7
   errmsgsize = lemonStrlen(errmsg);
e30c1c7
   /* Remove trailing '\n's from the error message. */
e30c1c7
@@ -2911,7 +2911,7 @@ struct lemon *lemp;
e30c1c7
     while( cfp ){
e30c1c7
       char buf[20];
e30c1c7
       if( cfp->dot==cfp->rp->nrhs ){
e30c1c7
-        sprintf(buf,"(%d)",cfp->rp->index);
e30c1c7
+        snprintf(buf,sizeof buf,"(%d)",cfp->rp->index);
e30c1c7
         fprintf(fp,"    %5s ",buf);
e30c1c7
       }else{
e30c1c7
         fprintf(fp,"          ");
e30c1c7
@@ -2966,6 +2966,7 @@ int modemask;
e30c1c7
 {
e30c1c7
   char *pathlist;
e30c1c7
   char *path,*cp;
e30c1c7
+  size_t pathsz;
e30c1c7
   char c;
e30c1c7
 
e30c1c7
 #ifdef __WIN32__
e30c1c7
@@ -2976,21 +2977,21 @@ int modemask;
e30c1c7
   if( cp ){
e30c1c7
     c = *cp;
e30c1c7
     *cp = 0;
e30c1c7
-    path = (char *)malloc( lemonStrlen(argv0) + lemonStrlen(name) + 2 );
e30c1c7
-    if( path ) sprintf(path,"%s/%s",argv0,name);
e30c1c7
+    path = (char *)malloc((pathsz=lemonStrlen(argv0) + lemonStrlen(name) + 2));
e30c1c7
+    if( path ) snprintf(path,pathsz,"%s/%s",argv0,name);
e30c1c7
     *cp = c;
e30c1c7
   }else{
e30c1c7
     extern char *getenv();
e30c1c7
     pathlist = getenv("PATH");
e30c1c7
     if( pathlist==0 ) pathlist = ".:/bin:/usr/bin";
e30c1c7
-    path = (char *)malloc( lemonStrlen(pathlist)+lemonStrlen(name)+2 );
e30c1c7
+    path = (char *)malloc((pathsz=lemonStrlen(pathlist)+lemonStrlen(name)+2));
e30c1c7
     if( path!=0 ){
e30c1c7
       while( *pathlist ){
e30c1c7
         cp = strchr(pathlist,':');
e30c1c7
         if( cp==0 ) cp = &pathlist[lemonStrlen(pathlist)];
e30c1c7
         c = *cp;
e30c1c7
         *cp = 0;
e30c1c7
-        sprintf(path,"%s/%s",pathlist,name);
e30c1c7
+        snprintf(path,pathsz,"%s/%s",pathlist,name);
e30c1c7
         *cp = c;
e30c1c7
         if( c==0 ) pathlist = "";
e30c1c7
         else pathlist = &cp[1];
e30c1c7
@@ -3070,14 +3071,16 @@ struct lemon *lemp;
e30c1c7
 
e30c1c7
   cp = strrchr(lemp->filename,'.');
e30c1c7
   if( cp ){
e30c1c7
-    sprintf(buf,"%.*s.lt",(int)(cp-lemp->filename),lemp->filename);
e30c1c7
+    snprintf(buf,sizeof buf,"%.*s.lt",(int)(cp-lemp->filename),lemp->filename);
e30c1c7
   }else{
e30c1c7
-    sprintf(buf,"%s.lt",lemp->filename);
e30c1c7
+    snprintf(buf,sizeof buf,"%s.lt",lemp->filename);
e30c1c7
   }
e30c1c7
   if( access(buf,004)==0 ){
e30c1c7
     tpltname = buf;
e30c1c7
   }else if( access(templatename,004)==0 ){
e30c1c7
     tpltname = templatename;
e30c1c7
+  }else if( access("/usr/share/lemon/lempar.c",004)==0 ){
e30c1c7
+    tpltname = "/usr/share/lemon/lempar.c";
e30c1c7
   }else{
e30c1c7
     tpltname = pathsearch(lemp->argv0,templatename,0);
e30c1c7
   }
e30c1c7
@@ -3089,7 +3092,7 @@ struct lemon *lemp;
e30c1c7
   }
e30c1c7
   in = fopen(tpltname,"rb");
e30c1c7
   if( in==0 ){
e30c1c7
-    fprintf(stderr,"Can't open the template file \"%s\".\n",templatename);
e30c1c7
+    fprintf(stderr,"Can't open the template file \"%s\".\n",tpltname);
e30c1c7
     lemp->errorcnt++;
e30c1c7
     return 0;
e30c1c7
   }
e30c1c7
@@ -3827,7 +3830,7 @@ int mhflag;     /* Output in makeheaders
e30c1c7
   /* Generate a table containing the symbolic name of every symbol
e30c1c7
   */
e30c1c7
   for(i=0; i<lemp->nsymbol; i++){
e30c1c7
-    sprintf(line,"\"%s\",",lemp->symbols[i]->name);
e30c1c7
+    snprintf(line,sizeof line,"\"%s\",",lemp->symbols[i]->name);
e30c1c7
     fprintf(out,"  %-15s",line);
e30c1c7
     if( (i&3)==3 ){ fprintf(out,"\n"); lineno++; }
e30c1c7
   }
e30c1c7
@@ -3983,7 +3986,7 @@ struct lemon *lemp;
e30c1c7
   in = file_open(lemp,".h","rb");
e30c1c7
   if( in ){
e30c1c7
     for(i=1; i<lemp->nterminal && fgets(line,LINESIZE,in); i++){
e30c1c7
-      sprintf(pattern,"#define %s%-30s %2d\n",prefix,lemp->symbols[i]->name,i);
e30c1c7
+      snprintf(pattern,sizeof pattern,"#define %s%-30s %2d\n",prefix,lemp->symbols[i]->name,i);
e30c1c7
       if( strcmp(line,pattern) ) break;
e30c1c7
     }
e30c1c7
     fclose(in);