1. Си / Говнокод #17449

    +136

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    struct hostent *rc_gethostbyname(const char *hostname)
    {
    	struct 	hostent *hp;
    #ifdef GETHOSTBYNAME_R
    #if defined (GETHOSTBYNAMERSTYLE_SYSV) || defined (GETHOSTBYNAMERSTYLE_GNU)
    	struct 	hostent hostbuf;
    	size_t	hostbuflen;
    	char	*tmphostbuf;
    	int	res;
    	int	herr;
    	
    	hostbuflen = 1024;
    	tmphostbuf = malloc(hostbuflen);
    #endif
    #endif
    
    #ifdef GETHOSTBYNAME_R
    #if defined (GETHOSTBYNAMERSTYLE_GNU)
    	while ((res = gethostbyname_r(hostname, &hostbuf, tmphostbuf, hostbuflen, &hp, &herr)) == ERANGE)
    	{
    		/* Enlarge the buffer */
    		hostbuflen *= 2;
    		tmphostbuf = realloc(tmphostbuf, hostbuflen);
    	}
    	free(tmphostbuf);
    #elif defined (GETHOSTBYNAMERSTYLE_SYSV)
    	hp = gethostbyname_r(hostname, &hostbuf, tmphostbuf, hostbuflen, &herr);
    	free(tmphostbuf);
    #else
    	hp = gethostbyname(hostname);
    #endif
    #else
    	hp = gethostbyname(hostname);
    #endif
    
    	if (hp == NULL) {
    		return NULL;
    	}
    	return hp;
    }

    freeradius-client 1.1.6, казалось бы серьезная либа... Говно мамонта, конечно, но оно валяется в репе бубунты 14.10... Неужели никто еще не заметил? :)

    Запостил: bormand, 15 Января 2015

    Комментарии (9) RSS

    • P.S. В хорошем коде herr не напишут.
      Ответить
      • P.P.S. Само собой, я это выложил не из-за строк 36-39. Проблема намного серьезней...
        Ответить
    • The caller supplies a hostent structure ret which will be filled in on success, and a temporary work buffer buf of size buflen

      Возвращаем указатель на стековую hostbuf?
      Ну и обработка ошибок как всегда на высоте. А что, если res не ERANGE? Почему herr нигде не проверяется? Мало ли какая в нём зараза.
      Ответить
      • > Возвращаем указатель на стековую hostbuf?
        Ну. Видимо, все писали в authserver и acctserver только айпишники, поэтому эта функция не вызывалась, и баг никто не замечал.

        P.S. У второго фрирадиуса код поприятней, его там неплохо причесали.
        Ответить
      • Там еще проявление бага забавное - прога начинает слать пакеты на какие-то рандомные серваки в инете (результат всегда ссылается на стек, поэтому ничего не крашится, просто 4 байта мусора берутся вместо ip).
        Ответить
    • Ну и опять неосиляторство индентации вложенных директив препроцессора. Мозг сломаешь, пока endif-ы в уме приклеишь.
      Ответить
    • Как страшно становится жить, когда представляешь, сколько такого вот говна крутится на твоей машине... И на машинах, которые обслуживают банковские транзакции, запускают спутники, ...
      https://twitter.com/xoposhiy/status/553516436187267072/photo/1
      Ответить
      • Ну это говно, слава богу, 6 лет назад уже закопали (но зачем-то держат в дистрибе). Просто я сегодня промахнулся пакетом, и поставил его вместо свежего.
        Ответить
      • <white>
        думаю, все же стажера берут обучать на решение таких задач, навырост
        денежная компенсация впечатляет...
        с другой стороны, и в москве на полнедели студента без опыта набирают незадорого
        чуть больше, конечно, но нихера не 150к, как размечтались в каментах
        </white>
        Ответить

    Добавить комментарий