[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Вопрос по 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: