Вопрос по 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 <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <mysql.h>
#include "conf.h"
#include "config.c"
#include "base_func.h"
#include "errno.h"
#include "timestr.c"
#include <sasl/md5global.h>
#include <sasl/md5.h>
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[1], row[2]);
exit(0);
}
else
{
fprintf(stdout, "Reply-Message=\"Client with MAC '%s', ip '%s', name '%s' is bloked.\"\n", username, row[1],row[2]);
exit(1);
}
}
else
{
fprintf(stdout, "Reply-Message=\"Share secret is wrong\"\n");
exit(1);
}
}
else if (strcmp(authtype, "CHAP") == 0)
{
MD5_CTX context;
char *passwd;
char *bloked;
static unsigned char hash[16];
command_length = sizeof(SQL_SELECT_CHAP) + strlen(username);
command = (char *) malloc(command_length*sizeof(char) + 1);
command_length = snprintf(command,command_length,SQL_SELECT_CHAP,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=\"User '%s' does not exist\"\n", username);
free(username);
free(challenge);
free(secret);
exit(1);
}
passwd = (char *) malloc(strlen(row[0])+1);
if ( !passwd )
{
free(username);
exit(1);
}
bloked = (char *) malloc(strlen(row[1])+1);
if ( !bloked )
{
free(username);
exit(1);
}
strcpy(passwd, row[0]);
strcpy(bloked, row[1]);
if (strcmp(bloked, "1") == 0)
{
free(passwd);
free(bloked);
sprintf(msg, "Account '%s' is currently Disabled. (auth_radius-%s)\n", username, VERSION);
dolog(msg);
free(username);
exit(1);
}
_sasl_MD5Init(&context);
_sasl_MD5Update(&context, secret, 1);
_sasl_MD5Update(&context, passwd, strlen(passwd));
_sasl_MD5Update(&context, challenge, strlen(challenge));
_sasl_MD5Final(hash, &context);
if(strncmp(secret+1,hash,16) == 0)
{
sprintf(msg, "CHAP Login OK for user '%s'.\n", username);
dolog(msg);
fprintf(stdout, "Service-Type = Framed-User\n");
fprintf(stdout, "Framed-Protocol = PPP\n");
fprintf(stdout, "Framed-IP-Address=\"%s\"\n", row[2]);
if (strcmp(row[3],"") != 0)
{
int tmp_speed, tmp_speed2;
tmp_speed = atoi(row[3])/8;
tmp_speed2 = tmp_speed * 2;
fprintf(stdout, "Cisco-AVPair =\"lcp:interface-config#1=rate-limit input %s %d %d conform-action transmit exceed-action drop\"\n", row[3], tmp_speed, tmp_speed2);
fprintf(stdout, "Cisco-AVPair =\"lcp:interface-config#2=rate-limit output %s %d %d conform-action transmit exceed-action drop\"\n", row[3], tmp_speed, tmp_speed2);
// fprintf(stdout, "Cisco-AVPair =\"lcp:interface-config#2=traffic-shape rate %s %d %d 128\"\n", row[3], tmp_speed, tmp_speed);
fprintf(stdout, "Download=\"%s\"\n", row[3]);
fprintf(stdout, "Upload=\"%s\"\n", row[3]);
}
else // Åñëè ñêîðîñòü íå óêàçàíà - ñòàâèì 32Ê ïî óìîë÷àíèþ
{
fprintf(stdout, "Cisco-AVPair =\"lcp:interface-config#1=rate-limit input 32000 4000 8000 conform-action transmit exceed-action drop\"\n");
fprintf(stdout, "Cisco-AVPair =\"lcp:interface-config#2=rate-limit output 32000 4000 8000 conform-action transmit exceed-action drop\"\n");
// fprintf(stdout, "Cisco-AVPair =\"lcp:interface-config#2=traffic-shape rate 32000 4000 4000 128\"\n");
fprintf(stdout, "Download=\"32000\"\n");
fprintf(stdout, "Upload=\"32000\"\n");
}
free(passwd);
free(username);
free(challenge);
free(secret);
exit(0);
}
else
{
sprintf(msg, "CHAP Authentication Failed for user %s\n", username);
dolog(msg);
free(passwd);
free(username);
free(challenge);
free(secret);
exit(1);
}
}
else
{
command_length = sizeof(SQL_SELECT) + strlen(username) + strlen(password);
command = (char *) malloc(command_length*sizeof(char) + 1);
command_length = snprintf(command,command_length,SQL_SELECT,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=\"User '%s' does not exist\"\n", username);
exit(1);
}
pw_string = (char *) malloc((strlen(row[0])*sizeof(char)));
if ( !pw_string )
{
fprintf(stdout, "Failed to alocate memory\n");
exit(1);
}
strcpy(pw_string, row[0]);
st = (char *) malloc(35*sizeof(char));
salt = (char *) malloc(13*sizeof(char));
if ( !st || !salt)
{
fprintf(stdout, "Failed to alocate memory\n");
exit(1);
}
strncpy(salt, pw_string, 12);
salt[12] = '\0';
strcpy (st, crypt_pw(password, salt));
if (strlen(pw_string) == 0)
{
printf("Reply-Message=\"Bad auth.\"\n");
exit(1);
}
if (strcmp(st, pw_string) == 0)
{
if (atoi(row[2]) != 0)
{
printf ("Reply-Message=\"You are bloked by server or haven\'t enouth money\"\n");
exit(1);
}
l = timestr_match(row[1], time(NULL));
if (l < 0)
{
printf ("Reply-Message=\"You are not allowed to work now\"\n");
exit(1);
}
else if (l == 0)
{
printf ("Reply-Message=\"All good\"\n");
exit(0);
}
else
{
printf ("Session-Timeout=\"%d\"\n",l);
exit(0);
}
}
else
{
printf("Reply-Message=\"Bad auth.\"\n");
exit(1);
}
}
}
Reply to: