[Wine] Message: "err:psdrv:PSDRV_PPDGetNextTuple Line too long."

viniciusneves wineforum-user at winehq.org
Wed Jul 7 07:05:48 CDT 2010


Hello!

When my application opens a URL in Firefox with more than 257 characters, the URL is truncated and the message below.

"Err: psdrv: PSDRV_PPDGetNextTuple Line too long."

I noted that this limitation may be due to the following code. See line 00363.


Code:

00354 /*********************************************************************
00355  *
00356  *          PSDRV_PPDGetNextTuple
00357  *
00358  * Gets the next Keyword Option Value tuple from the file. Allocs space off
00359  * the process heap which should be free()ed by the caller if not needed.
00360  */
00361 static BOOL PSDRV_PPDGetNextTuple(FILE *fp, PPDTuple *tuple)
00362 {
00363     char line[257], *opt, *cp, *trans, *endkey;
00364     BOOL gotoption;
00365 
00366  start:
00367 
00368     gotoption = TRUE;
00369     opt = NULL;
00370     memset(tuple, 0, sizeof(*tuple));
00371 
00372     do {
00373         if(!fgets(line, sizeof(line), fp))
00374             return FALSE;
00375       if(line[0] == '*' && line[1] != '%' && strncmp(line, "*End", 4))
00376           break;
00377     } while(1);
00378 
00379     if(line[strlen(line)-1] != '\n') {
00380         ERR("Line too long.\n");
00381       goto start;
00382     }
00383 
00384     for(cp = line; !isspace(*cp) && *cp != ':'; cp++)
00385         ;
00386 
00387     endkey = cp;
00388     if(*cp == ':') { /* <key>: */
00389         gotoption = FALSE;
00390     } else {
00391       while(isspace(*cp))
00392           cp++;
00393       if(*cp == ':') { /* <key>  : */
00394           gotoption = FALSE;
00395       } else { /* <key> <option> */
00396           opt = cp;
00397       }
00398     }
00399 
00400     tuple->key = HeapAlloc( PSDRV_Heap, 0, endkey - line + 1 );
00401     if(!tuple->key) return FALSE;
00402 
00403     memcpy(tuple->key, line, endkey - line);
00404     tuple->key[endkey - line] = '\0';
00405 
00406     if(gotoption) { /* opt points to 1st non-space character of the option */
00407         cp = strpbrk(opt, ":/");
00408       if(!cp) {
00409           ERR("Error in line '%s'?\n", line);
00410             HeapFree(GetProcessHeap(), 0, tuple->key);
00411           goto start;
00412       }
00413       tuple->option = HeapAlloc( PSDRV_Heap, 0, cp - opt + 1 );
00414       if(!tuple->option) return FALSE;
00415       memcpy(tuple->option, opt, cp - opt);
00416       tuple->option[cp - opt] = '\0';
00417       if(*cp == '/') {
00418           char *buf;
00419           trans = cp + 1;
00420           cp = strchr(trans, ':');
00421           if(!cp) {
00422               ERR("Error in line '%s'?\n", line);
00423                 HeapFree(GetProcessHeap(), 0, tuple->option);
00424                 HeapFree(GetProcessHeap(), 0, tuple->key);
00425             goto start;
00426           }
00427           buf = HeapAlloc( PSDRV_Heap, 0, cp - trans + 1 );
00428           if(!buf) return FALSE;
00429           memcpy(buf, trans, cp - trans);
00430           buf[cp - trans] = '\0';
00431           tuple->opttrans = PSDRV_PPDDecodeHex(buf);
00432           HeapFree( PSDRV_Heap, 0, buf );
00433       }
00434     }
00435 
00436     /* cp should point to a ':', so we increment past it */
00437         cp++;
00438 
00439     while(isspace(*cp))
00440         cp++;
00441 
00442     switch(*cp) {
00443     case '"':
00444         if( (!gotoption && strncmp(tuple->key, "*?", 2) ) ||
00445            !strncmp(tuple->key, "*JCL", 4))
00446           PSDRV_PPDGetQuotedValue(fp, cp, tuple);
00447         else
00448           PSDRV_PPDGetInvocationValue(fp, cp, tuple);
00449       break;
00450 
00451     case '^':
00452         PSDRV_PPDGetSymbolValue(cp, tuple);
00453       break;
00454 
00455     default:
00456         PSDRV_PPDGetStringValue(cp, tuple);
00457     }
00458     return TRUE;
00459 }




Source: http://wine.sourcearchive.com/lines/1.0.1-0ubuntu2/ppd_8c-source.html

Is there any way around this limitation? 

Thank you.







More information about the wine-users mailing list