Вопрос по gcc-4.1
Добрый день Понимаю что офтоп, но простите, это в первый раз в этом году :) Тему про индуских программистов тоже читал и честно попытался в течении дня найти ответ в конференциях и google, но видимо не хватает общих знаний по данному вопросу. Год назад была написана програмка для авторизации через радиус (xtradius - внешний модуль авторизации). С gcc-3.4 все компилируется и работает без проблем. Пришел новый сервер, на него поставил etch и решил пересобрать с gcc-4.1 - при сборке показало варнинг и перестала работать CHAP авторизация. Если не сложно - подскажите, что не устраивает новый gcc, так как на C писать приходилось только чуть-чуть, а этот кусок кода был найден где-то на просторах интернета... Вот текст ошибки, код в приложении. gcc-4.1 -c auth_radius.c -O3 -ffast-math -march=i686 -funroll-loops -Wall -W -DCRYPT -I/usr/include/mysql auth_radius.c: In function 'main': auth_radius.c:208: warning: pointer targets in passing argument 1 of 'strlen' differ in signedness auth_radius.c:208: warning: pointer targets in passing argument 1 of 'strlen' differ in signedness auth_radius.c:208: warning: pointer targets in passing argument 2 of '__builtin_strcmp' differ in signedness auth_radius.c:208: warning: pointer targets in passing argument 2 of '__builtin_strcmp' differ in signedness auth_radius.c:208: warning: pointer targets in passing argument 1 of 'strlen' differ in signedness auth_radius.c:208: warning: pointer targets in passing argument 2 of '__builtin_strcmp' differ in signedness auth_radius.c:208: warning: pointer targets in passing argument 2 of '__builtin_strcmp' differ in signedness auth_radius.c:208: warning: pointer targets in passing argument 2 of 'strncmp' differ in signedness gcc-4.1 -o auth_radius auth_radius.o -L/usr/lib -lmysqlclient -lcrypt -lsasl2 -lz #include #include #include #include #include #include #include "conf.h" #include "config.c" #include "base_func.h" #include "errno.h" #include "timestr.c" #include #include char *crypt(const char *key, const char *salt); char *crypt_pw(char *ct_pw, char *salt); MYSQL mysql; char *SQL; int rc; char *crypt_pw(char *ct_pw, char *salt) { char *st; st = (char *) malloc(35*sizeof(char)); strcpy(st, (char *) crypt(ct_pw, salt)); return st; } int main (int argc, char *argv[]) { MYSQL_RES *result; MYSQL_ROW row; char *st; char *salt; char *pw_string; int l; char *command; int command_length, rc, ret; char *username = ""; char *password = ""; char msg[256]; char *challenge = ""; char *secret = ""; char authtype[4]; ret = 0; readConfigFile (CONFIG_FILE); username = strdup(argv[1]); if (argc == 2) { strcpy(authtype, "CHAP"); } else if (argc == 3) { strcpy(authtype, "PAP"); } if (strcmp(authtype, "PAP") == 0) { if (getenv("Password")) { password = getenv("Password"); } else { password = strdup(argv[2]); } } else if (strcmp(authtype, "CHAP") == 0) { challenge = (char *) malloc (sizeof(char)*256); pack(getenv("CHAP-Challenge"),challenge); secret = (char *) malloc (sizeof(char)*256); pack(getenv("CHAP-Password"),secret); } mysql_init(&mysql); if (!mysql_real_connect(&mysql,mysql_server,mysql_user,mysql_passwd,mysql_database,0,NULL,0)) { fprintf(stderr, "Failed to connect to database: Error: %s\n", mysql_error(&mysql)); exit(1); } command_length = sizeof(SQL_SET_NAMES); command = (char *) malloc(command_length*sizeof(char) + 1); command_length = snprintf(command,command_length,SQL_SET_NAMES); rc = mysql_real_query(&mysql, command, command_length); if (rc) { printf("Blah! %s\n", mysql_error(&mysql)); exit(1); } free(command); if ((strstr(username, ":")) || ((strlen(username) == 13) && (strstr(username, "-" { if ((strlen(username) == 13) && (strstr(username, "-"))) { sprintf (username, "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c", username[0],username[1],username[2],username[3],username[4],username[5],username[7],username[8],username[9],username[10],username[11],username[12]); } if (strcmp(password,radius_share_secret) == 0) { command_length = sizeof(SQL_SELECT_RADIO) + strlen(username); command = (char *) malloc(command_length*sizeof(char) + 1); command_length = snprintf(command,command_length,SQL_SELECT_RADIO,username); rc = mysql_real_query(&mysql, command, command_length); if (rc) { printf("Blah! %s\n", mysql_error(&mysql)); exit(1); } free(command); result = mysql_store_result(&mysql); row = mysql_fetch_row(result); mysql_free_result(result); mysql_close(&mysql); if ( !row ) { fprintf(stdout, "Reply-Message=\"We havent client with MAC '%s'\"\n", username); exit(1); } if (strcmp(row[0],"0") == 0) { fprintf(stdout, "Reply-Message=\"All OK, password '%s', ip '%s', name '%s'\"\n", password, row[
Re: Вопрос по gcc-4.1
On Mon, Jan 01, 2007 at 02:23:51PM +0200, Dmitriy Sirant wrote: > Вот текст ошибки, код в приложении. > > gcc-4.1 -c auth_radius.c -O3 -ffast-math -march=i686 -funroll-loops > -Wall -W -DCRYPT -I/usr/include/mysql > auth_radius.c: In function 'main': > auth_radius.c:208: warning: pointer targets in passing argument 1 of > 'strlen' differ in signedness Это ругань на то что strncmp подсовывается unsigned char* в качестве одного из аргумента. ПО идее от warning-а избавит замена if(strncmp(secret+1,hash,16) == 0) на if(strncmp(secret+1,(char*)hash,16) == 0) Но это вряд ли является причиной проблемы. -- WBR, Dmitry signature.asc Description: Digital signature
Re: Вопрос по gcc-4.1
Это ругань на то что strncmp подсовывается unsigned char* в качестве одного из аргумента. ПО идее от warning-а избавит замена if(strncmp(secret+1,hash,16) == 0) на if(strncmp(secret+1,(char*)hash,16) == 0) Но это вряд ли является причиной проблемы. Как Вы и предполагали - это решило проблему warning-a но не решило сути проблемы, всеравно авторизация CHAP не проходит при компиляции gcc-4.1. Как мне написал в личку Victor Wagner - это не единственная проблема с gcc-4.1: http://gcc.gnu.org/ml/gcc/2006-07/msg00037.html Жаль... буду либо использовать gcc-3.4 либо ждать gcc-4.2 -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
Re: Вопрос по gcc-4.1
Hi Dmitriy, * Dmitriy Sirant <[EMAIL PROTECTED]> * 2007-01-02 06:17: > Как Вы и предполагали - это решило > проблему warning-a но не решило сути > проблемы, всеравно авторизация CHAP не > проходит при компиляции gcc-4.1. Как мне > написал в личку Victor Wagner - это не > единственная проблема с gcc-4.1: > http://gcc.gnu.org/ml/gcc/2006-07/msg00037.html > > Жаль... буду либо использовать gcc-3.4 либо > ждать gcc-4.2 Честно говоря оно может и должно работать, но я бы так никогда бы не написал: char authtype[4]; ... else if (strcmp(authtype,"CHAP") == 0) { ... Ниже не смотрел. -- Best regards, Sergey Chumakov 2:450/77[.43] -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
Re: Вопрос по gcc-4.1
Hi debian-russian, * Sergey Chumakov <[EMAIL PROTECTED]> * 2007-01-02 11:11: > > проблемы, всеравно авторизация CHAP не > > проходит при компиляции gcc-4.1. Как мне > > написал в личку Victor Wagner - это не > > единственная проблема с gcc-4.1: > > http://gcc.gnu.org/ml/gcc/2006-07/msg00037.html > > > > Жаль... буду либо использовать gcc-3.4 либо > > ждать gcc-4.2 > > Честно говоря оно может и должно работать, но я бы так никогда бы не > написал: > > char authtype[4]; > ... > else if (strcmp(authtype,"CHAP") == 0) > { > ... > > Ниже не смотрел. Вот выше еще есть strcpy(authtype, "CHAP"); Что-то сомневаюсь я, что проблема в gcc -- Best regards, Sergey Chumakov 2:450/77[.43] -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
Re: Вопрос по gcc-4.1
On 2007.01.02 at 11:16:11 +0200, Sergey Chumakov wrote: > > Честно говоря оно может и должно работать, но я бы так никогда бы не > > написал: > > > > char authtype[4]; > > ... > > else if (strcmp(authtype,"CHAP") == 0) > > { > > ... > > > > Ниже не смотрел. > > Вот выше еще есть > > strcpy(authtype, "CHAP"); > > Что-то сомневаюсь я, что проблема в gcc Проблема в том, что gcc 4.x намного строже относится к таким вещам. Если на gcc 3 оно прокатывало, на gcc 4 будет либо ругаться при компиляции, либо отваливаться во время выполнения. Можно ещё попроболать запустить с libefence или valgrind. Они в этом коде явно наловят кучу ошибок. -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
Re: Вопрос по gcc-4.1
Victor Wagner пишет: On 2007.01.02 at 11:16:11 +0200, Sergey Chumakov wrote: Честно говоря оно может и должно работать, но я бы так никогда бы не написал: char authtype[4]; ... else if (strcmp(authtype,"CHAP") == 0) { ... Ниже не смотрел. Вот выше еще есть strcpy(authtype, "CHAP"); Что-то сомневаюсь я, что проблема в gcc Нда, когда ткнули носом - понял... Проблема в том, что gcc 4.x намного строже относится к таким вещам. Если на gcc 3 оно прокатывало, на gcc 4 будет либо ругаться при компиляции, либо отваливаться во время выполнения. Можно ещё попроболать запустить с libefence или valgrind. Они в этом коде явно наловят кучу ошибок. Пошел проверять этими вещами... -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
Re: Вопрос по gcc-4.1
Dmitriy Sirant <[EMAIL PROTECTED]> wrote: > [-- text/plain, кодировка quoted-printable, кодировка: KOI8-R, 59 строк --] > Добрый день > Понимаю что офтоп, но простите, это в первый раз в этом году :) > Тему про индуских программистов тоже читал и честно попытался в течении > дня найти ответ в конференциях и google, но видимо не хватает общих > знаний по данному вопросу. [skipp] > Вот текст ошибки, код в приложении. За такой код бить граблями надо. > gcc-4.1 -c auth_radius.c -O3 -ffast-math -march=i686 -funroll-loops > -Wall -W -DCRYPT -I/usr/include/mysql -O3 убери. -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
Re: Вопрос по gcc-4.1
Hi Victor, * Victor Wagner <[EMAIL PROTECTED]> * 2007-01-02 12:06: > On 2007.01.02 at 11:16:11 +0200, Sergey Chumakov wrote: > > > > Честно говоря оно может и должно работать, но я бы так никогда бы > > > не > > > написал: > > > > > > char authtype[4]; > > > ... > > > else if (strcmp(authtype,"CHAP") == 0) > > > { > > > ... > > > > > > Ниже не смотрел. > > > > Вот выше еще есть > > > > strcpy(authtype, "CHAP"); > > > > Что-то сомневаюсь я, что проблема в gcc > > Проблема в том, что gcc 4.x намного строже относится к таким вещам. > Если на gcc 3 оно прокатывало, на gcc 4 будет либо ругаться при > компиляции, либо отваливаться во время выполнения. Для меня главная проблема - заставить/научить писать нормальный код и проверять написанное самостоятельно. > Можно ещё попроболать запустить с libefence или valgrind. > Они в этом коде явно наловят кучу ошибок. Лучше переписать неспешно. Дешевле выйдет. Чем потом за "индусами" подтирать. Вообще с индусами мне просто не везет наверное, это я не в плане дискриминации по национальному признаку. -- Best regards, Sergey Chumakov 2:450/77[.43] -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
Re: Вопрос по gcc-4.1
Andrey Melnikoff пишет: Dmitriy Sirant <[EMAIL PROTECTED]> wrote: [-- text/plain, кодировка quoted-printable, кодировка: KOI8-R, 59 строк --] Добрый день Понимаю что офтоп, но простите, это в первый раз в этом году :) Тему про индуских программистов тоже читал и честно попытался в течении дня найти ответ в конференциях и google, но видимо не хватает общих знаний по данному вопросу. [skipp] Вот текст ошибки, код в приложении. За такой код бить граблями надо. gcc-4.1 -c auth_radius.c -O3 -ffast-math -march=i686 -funroll-loops -Wall -W -DCRYPT -I/usr/include/mysql -O3 убери. Вы знаете, я спустя год глянул на этот код и сам ужаснулся. Дело в том что все писалось в несколько заходов и максимум что от него требовалось - чтобы заработало. Оно как-то работало (хотя лучшебы не работало). После того как сейчас я попробовал все это привести к удобочитаемому (и работающему) виду я понял, что легче будет написать это все с нуля (как уже советовали выше). -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
Re: Вопрос по gcc-4.1
Dmitry Nezhevenko -> debian-russian@lists.debian.org @ Mon, 1 Jan 2007 18:28:55 +0200: >> Вот текст ошибки, код в приложении. >> >> gcc-4.1 -c auth_radius.c -O3 -ffast-math -march=i686 -funroll-loops >> -Wall -W -DCRYPT -I/usr/include/mysql >> auth_radius.c: In function 'main': >> auth_radius.c:208: warning: pointer targets in passing argument 1 of >> 'strlen' differ in signedness DN> Это ругань на то что strncmp подсовывается unsigned char* в качестве DN> одного из аргумента. ПО идее от warning-а избавит замена DN>if(strncmp(secret+1,hash,16) == 0) DN> на DN>if(strncmp(secret+1,(char*)hash,16) == 0) DN> Но это вряд ли является причиной проблемы. Натурально. Причиной проблемы является то, что используется strncmp вместо memcmp. -- Artem Chuprina RFC2822: Jabber: [EMAIL PROTECTED] /dev/null-транспортировка -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
Re: Вопрос по gcc-4.1
On Fri, Jan 05, 2007 at 07:19:46PM +0300, Artem Chuprina wrote: > DN> if(strncmp(secret+1,hash,16) == 0) > DN> на > DN> if(strncmp(secret+1,(char*)hash,16) == 0) > > DN> Но это вряд ли является причиной проблемы. > > Натурально. Причиной проблемы является то, что используется strncmp > вместо memcmp. > Хм. точно. в hash лежит 16-байтная md5, которая может содержать \0 -- WBR, Dmitry signature.asc Description: Digital signature
Re: Вопрос по gcc-4.1
Dmitry Nezhevenko -> debian-russian@lists.debian.org @ Sat, 6 Jan 2007 02:27:46 +0200: >> DN>if(strncmp(secret+1,hash,16) == 0) >> DN> на >> DN>if(strncmp(secret+1,(char*)hash,16) == 0) >> >> DN> Но это вряд ли является причиной проблемы. >> >> Натурально. Причиной проблемы является то, что используется strncmp >> вместо memcmp. >> DN> Хм. точно. в hash лежит 16-байтная md5, которая может содержать \0 Что тоже хорошо. А еще там где-то, кажется, в 16-байтовый буфер писалась 16-символьная (17-байтовая, сиречь) строка... -- Artem Chuprina RFC2822: Jabber: [EMAIL PROTECTED] Юзер упорствует в хождении по граблям. Образовавшиеся шишки он считает трудовыми мозолями. (С)энта -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
Re: Вопрос по gcc-4.1
Dmitriy Sirant <[EMAIL PROTECTED]> wrote: > Andrey Melnikoff пишет: > > Dmitriy Sirant <[EMAIL PROTECTED]> wrote: > >> [-- text/plain, кодировка quoted-printable, кодировка: KOI8-R, 59 строк --] > > > >> Добрый день > > > >> Понимаю что офтоп, но простите, это в первый раз в этом году :) > >> Тему про индуских программистов тоже читал и честно попытался в течении > >> дня найти ответ в конференциях и google, но видимо не хватает общих > >> знаний по данному вопросу. > > > > [skipp] > > > >> Вот текст ошибки, код в приложении. > > За такой код бить граблями надо. > > > >> gcc-4.1 -c auth_radius.c -O3 -ffast-math -march=i686 -funroll-loops > >> -Wall -W -DCRYPT -I/usr/include/mysql > > -O3 убери. > Вы знаете, я спустя год глянул на этот код и сам ужаснулся. Дело в том > что все писалось в несколько заходов и максимум что от него требовалось > - чтобы заработало. Оно как-то работало (хотя лучшебы не работало). > После того как сейчас я попробовал все это привести к удобочитаемому (и > работающему) виду я понял, что легче будет написать это все с нуля (как > уже советовали выше). прогони через indent - читаться танет лучше. -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]