Thread overview
problems with sscanf : small example
Mar 20, 2004
C
Mar 21, 2004
Walter
Mar 21, 2004
Walter
Mar 21, 2004
C
Mar 21, 2004
Walter
Mar 21, 2004
C
Mar 23, 2004
C
Mar 24, 2004
Walter
Mar 24, 2004
C
March 20, 2004
#include <stdio.h>

int main () {

        char* url = "http://www.google.com";
        char proto[4096];
        char path[4096];
        printf("%d\n",sscanf(url, "%64[^:]:%[^\n]",
                           proto,
                           path));

        puts(proto);
        puts(path);
}


Expected output is

2
http
//www.google.com

Actual output is one new line.

Thanks!
Charles





-- 
D Newsgroup.
March 21, 2004
Thanks, I'll check it out. BTW, if that code appears in libcurl, it looks to me like an exploitable buffer overflow problem.

"C" <dont@respond.com> wrote in message news:opr46nwb0xehmtou@localhost... #include <stdio.h>

int main () {

         char* url = "http://www.google.com";
         char proto[4096];
         char path[4096];
         printf("%d\n",sscanf(url, "%64[^:]:%[^\n]",
                            proto,
                            path));

         puts(proto);
         puts(path);
}


Expected output is

2
http
//www.google.com

Actual output is one new line.

Thanks!
Charles





-- 
D Newsgroup.


March 21, 2004
"Walter" <walter@digitalmars.com> wrote in message news:c3jkml$kti$1@digitaldaemon.com...
> Thanks, I'll check it out.

It is a bug in sscanf, fixed now.


March 21, 2004
> Thanks, I'll check it out. BTW, if that code appears in libcurl, it looks to
> me like an exploitable buffer overflow problem.

Nah that was just a small example, they dynamically allocate space for path.

> It is a bug in sscanf, fixed now.

Awesome! When can we download an update ?

Thanks,
C

On Sun, 21 Mar 2004 01:20:07 -0800, Walter <walter@digitalmars.com> wrote:

>
> "Walter" <walter@digitalmars.com> wrote in message
> news:c3jkml$kti$1@digitaldaemon.com...
>> Thanks, I'll check it out.
>
> It is a bug in sscanf, fixed now.
>
>



-- 
D Newsgroup.
March 21, 2004
"C" <dont@respond.com> wrote in message news:opr473cp0dehmtou@localhost...
>Awesome! When can we download an update ?

I don't want to do an update just for that, but I can email it to you.


March 21, 2004
Ok im at qbert@atari-soldiers.com.  Preciate you ;).

C

On Sun, 21 Mar 2004 10:19:08 -0800, Walter <walter@digitalmars.com> wrote:

>
> "C" <dont@respond.com> wrote in message news:opr473cp0dehmtou@localhost...
>> Awesome! When can we download an update ?
>
> I don't want to do an update just for that, but I can email it to you.
>
>



-- 
D Newsgroup.
March 23, 2004
That got it :).  Libcurl for D now works on windows also.  I'd like to post the makefile to libcurl but currently the preprocessor is choking on the CFINIT and CINIT macros with the errors

  CINIT(FILE, OBJECTPOINT, 1),
                           ^
../include\curl/curl.h(366) : Error: '}' expected
  CFINIT(NOTHING),        /********* the first one is unused ************/
               ^
../include\curl/curl.h(899) : Error: '}' expected
  CFINIT(COPYNAME),
                ^
../include\curl/curl.h(902) : Error: missing ',' between declaration of 'CURLFO
M_' and 'COPYNAME'
        CURLformoption          option;
                                     ^
../include\curl/curl.h(930) : Error: ';' expected following declaration of stru
t member
CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
                                               ^
../include\curl/easy.h(30) : Error: ')' expected
Fatal error: too many errors
--- errorlevel 1


those are defined as

#ifdef CURL_ISOCPP
#define CFINIT(name) CURLFORM_ ## name
#else
/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
#define CFINIT(name) CURLFORM_/**/name
#endif

and


#ifdef CURL_ISOCPP
#define CINIT(name,type,number) CURLOPT_ ## name = CURLOPTTYPE_ ## type + number
#else
#define CINIT(name,type,number) CURLOPT_/**/name = type + number
#endif


The same error message is generated wether CURL_ISOCPP is defined or not.  Its used like


typedef enum {
  /* This is the FILE * or void * the regular output should be written to. */
  CINIT(FILE, OBJECTPOINT, 1),

  /* The full URL to get/put */
  CINIT(URL,  OBJECTPOINT, 2),

  /* Port number to connect to, if other than default. */
  CINIT(PORT, LONG, 3),

  /* Name of proxy to use. */
  CINIT(PROXY, OBJECTPOINT, 4),

  /* "name:password" to use when fetching. */
  CINIT(USERPWD, OBJECTPOINT, 5),

  /* "name:password" to use with proxy. */
  CINIT(PROXYUSERPWD, OBJECTPOINT, 6),

...

and


typedef enum {
  CFINIT(COPYNAME),
  CFINIT(PTRNAME),
  CFINIT(NAMELENGTH),
  CFINIT(COPYCONTENTS),
  CFINIT(PTRCONTENTS),
  CFINIT(CONTENTSLENGTH),
...



Thanks!
Charles


On Sun, 21 Mar 2004 12:44:18 -0800, C <dont@respond.com> wrote:

> Ok im at qbert@atari-soldiers.com.  Preciate you ;).
>
> C
>
> On Sun, 21 Mar 2004 10:19:08 -0800, Walter <walter@digitalmars.com> wrote:
>
>>
>> "C" <dont@respond.com> wrote in message news:opr473cp0dehmtou@localhost...
>>> Awesome! When can we download an update ?
>>
>> I don't want to do an update just for that, but I can email it to you.
>>
>>
>
>
>



-- 
D Newsgroup.
March 24, 2004
I attempted to reconstruct your code, filling in missing stuff, into the following file which compiles successfully. (This is why I am so adamant about, when posting bug reports, please leave nothing to my imagination! There's always something critical left out.)
---------------------------------------------------------------

#define CURLOPTTYPE_OBJECTPOINT 1
#define CURLOPTTYPE_LONG 2

#define CURL_ISOCPP 1

#ifdef CURL_ISOCPP
#define CFINIT(name) CURLFORM_ ## name
#else
/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
#define CFINIT(name) CURLFORM_/**/name
#endif

#ifdef CURL_ISOCPP
#define CINIT(name,type,number) CURLOPT_ ## name = CURLOPTTYPE_ ## type +
number
#else
#define CINIT(name,type,number) CURLOPT_/**/name = type + number
#endif


typedef enum {
   /* This is the FILE * or void * the regular output should be written to.
*/
   CINIT(FILE, OBJECTPOINT, 1),

   /* The full URL to get/put */
   CINIT(URL,  OBJECTPOINT, 2),

   /* Port number to connect to, if other than default. */
   CINIT(PORT, LONG, 3),

   /* Name of proxy to use. */
   CINIT(PROXY, OBJECTPOINT, 4),

   /* "name:password" to use when fetching. */
   CINIT(USERPWD, OBJECTPOINT, 5),

   /* "name:password" to use with proxy. */
   CINIT(PROXYUSERPWD, OBJECTPOINT, 6),

} y;


typedef enum {
   CFINIT(COPYNAME),
   CFINIT(PTRNAME),
   CFINIT(NAMELENGTH),
   CFINIT(COPYCONTENTS),
   CFINIT(PTRCONTENTS),
   CFINIT(CONTENTSLENGTH),
} x;


March 24, 2004
Ugh, your right CURL_ISOCPP was getting undefined somewhere else :(.  Sorry!  Thanks for the time , libcurl is invaluable to me, so I appreciated your attention on all of this.

Thanks as usual,
Charlie

On Tue, 23 Mar 2004 23:56:38 -0800, Walter <walter@digitalmars.com> wrote:

> I attempted to reconstruct your code, filling in missing stuff, into the
> following file which compiles successfully. (This is why I am so adamant
> about, when posting bug reports, please leave nothing to my imagination!
> There's always something critical left out.)
> ---------------------------------------------------------------
>
> #define CURLOPTTYPE_OBJECTPOINT 1
> #define CURLOPTTYPE_LONG 2
>
> #define CURL_ISOCPP 1
>
> #ifdef CURL_ISOCPP
> #define CFINIT(name) CURLFORM_ ## name
> #else
> /* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */
> #define CFINIT(name) CURLFORM_/**/name
> #endif
>
> #ifdef CURL_ISOCPP
> #define CINIT(name,type,number) CURLOPT_ ## name = CURLOPTTYPE_ ## type +
> number
> #else
> #define CINIT(name,type,number) CURLOPT_/**/name = type + number
> #endif
>
>
> typedef enum {
>    /* This is the FILE * or void * the regular output should be written to.
> */
>    CINIT(FILE, OBJECTPOINT, 1),
>
>    /* The full URL to get/put */
>    CINIT(URL,  OBJECTPOINT, 2),
>
>    /* Port number to connect to, if other than default. */
>    CINIT(PORT, LONG, 3),
>
>    /* Name of proxy to use. */
>    CINIT(PROXY, OBJECTPOINT, 4),
>
>    /* "name:password" to use when fetching. */
>    CINIT(USERPWD, OBJECTPOINT, 5),
>
>    /* "name:password" to use with proxy. */
>    CINIT(PROXYUSERPWD, OBJECTPOINT, 6),
>
> } y;
>
>
> typedef enum {
>    CFINIT(COPYNAME),
>    CFINIT(PTRNAME),
>    CFINIT(NAMELENGTH),
>    CFINIT(COPYCONTENTS),
>    CFINIT(PTRCONTENTS),
>    CFINIT(CONTENTSLENGTH),
> } x;
>
>



-- 
D Newsgroup.