오탈자
도전 1
whlie(*src && left)
{
*dst++=*src++;
if (left = 0)
die("badlen");
left--;
}
if
조건에 관계 연산자 ==
대신 대입 연산자 =
가 설정되어 있다. 이로 인해 left
이 0으로 설정되어도 while
구문을 벗어나지 못하고 left
값을 감소시키며 반복 수행한다.
수정 코드
if (left == 0)
도전 2
int f;
f=get_security_flags(username);
if(f = FLAG_AUTHENTICATED)
{
return LOGIN_OK;
}
return LOGIN_FAILED;
if
조건에 관계 연산자 ==
대신 대입 연산자 =
가 설정되어 있어 get_security_flags
결과와 무관하게 로그인 성공을 반환하고 있다.
수정 코드
if(f == FLAG_AUTHENTICATED)
도전 3
for (i==5; src[i] && i<10; i++)
{
dst[i-5]=src[i];
}
for
조건에 대입 연산자 =
대신에 관계 연산자 ==
가 설정되어 있어 i
가 10보다 작은 값일 때, 버퍼를 벗어날 위험이 있다.
수정 코드
for (i=5; src[i] && i<10; i++)
도전 4
if (get_string(src) && check_for_overflow(src) & copy_string(dst, src))
printf("string safely copied\n");
논리 연산자 &&
대신에 비트 연산자 &
가 조건으로 설정되어 있어 문자열 복사 작업 실패 시에도 성공 문구를 출력하고 있다.
수정 코드
if (get_string(src) && check_for_overflow(src) && copy_string(dst, src))
도전 5
if (len > 0 && len <= sizeof(dst));
memcpy(dst, src, len);
if
뒤 ;
이 존재하여 길이 검사 결과와 무관하게 memcpy
를 실행한다.
수정 코드
if (len > 0 && len <= sizeof(dst))
도전 6
char buf[040];
snprintf(buf, 40, "%s", userinput);
숫자 앞에 0
을 접두사로 사용하면 8진수로 인식되므로 의도한 것보다 작은 배열 공간 (buf[32]
)을 할당하게 된다.
수정 코드
char buf[40];
도전 7
if (len < 0 || len > sizeof(dst)) /* 길이 검사
die("bad length!");
/* length ok */
memcpy(dst, src, len);
if
뒤 주석을 닫지 않아 길이 검사를 실패할 경우에만 memcpy
를 실행한다.
수정 코드
if (len < 0 || len > sizeof(dst)) /* 길이 검사 */
도전 8
if (len > 0 && len <= sizeof(dst))
copiedflag = 1;
memcpy(dst, src, len);
if (!copiedflag)
die("didn't copy");
괄호가 생략되어 있어 길이 검사 결과와 무관하게 memcpy
가 실행된다.
수정 코드
if (len > 0 && len <= sizeof(dst))
{
copiedflag = 1;
memcpy(dst, src, len);
}
도전 9
if (!strncmp(src, "magicword", 9))
// report_magic(1);
if (len < 0 || len > sizeof(dst))
assert("bad length!");
/* length ok */
memcpy(dst, src, len);
if
에서 ;
를 생략했기 때문에 memcpy
는 언제나 실행된다.
수정 코드
if (!strncmp(src, "magicword", 9))
// report_magic(1);
;
도전 10
l = msg_hdr.msg_len;
frag_off = msg_hdr.frag_off;
frag_len = msg_hdr.frag_len;
...
if (frag_len > (unsigned long)max)
{
al=SSL_AD_ILLEGAL_PARAMETER;
SSLerr(SSL_F_DTLSl_GET_MESSAGE_FRAGMENT, SSL_R_EXCESSIVE_MESSAGE_SIZE);
goto f_err;
}
if (frag_len + s->init_num > (INT_MAX - DTLSl_HM_HEADER_LENGTH))
{
al=SSL_AD_ILLEGAL_PARAMETER;
SSLerr(SSL_F_DTLSl_GET_MESSAGE_FRAGMENT, SSL_R_EXCESSIVE_MESSAGE_SIZE);
goto f_err;
}
if (frag_len & !BUF_MEM_grow_clean(s->init_buf, (int)frag_len + DTLSl_HM_HEADER_LENGTH + s->init_num))
{
SSLerr(SSL_F_DTLSl_GET_MESSAGE_FRAGMENT, ERR_R_BUF_LIB);
goto err;
}
if (s->dl->r_msg_hdr.frag_off == 0)
{
s->s3->tmp.message_type = msg_hdr.type;
s->dl->r_msg_hdr.type = msg_hdr.type;
s->dl->r_msg_hdr.msg_len = 1;
/* s->dl->r_msg_hdr.seq = seq_num; */
}
/* XDTLS: ressurect this when restart is in place */
s->state=stn;
/* next state (stn) */
p = (unsigned char *))s->init_buf->data;
if (frag_len > 0)
{
i=s->method->ssl_read_bytes(s, SSL3_RT_HANDSHAKE, &p[s->init_num], frag_len, 0);
/* XDTLS: fix this-message fragments cannot span multiple packets */
if (i <= 0)
{
s->rwstate=SSL_READING;
*ok = 0;
return i;
}
}
else
i = 0;
길이 검사 중 하나에서 논리 연산자 &&
를 사용해야 하는 곳에 비트 연산자 &
를 사용하는 실수를 저질렀다.
수정 코드
if (frag_len && !BUF_MEM_grow_clean(s->init_buf, (int)frag_len + DTLSl_HM_HEADER_LENGTH + s->init_num))