|
LwIP это потенциально опасное ПО или нет?, или я неправильно понял и не знаю что и как |
|
|
|
Apr 7 2016, 12:59
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Вот если я скажем делаю так (использую NetConn API): Код struct netconn *conn, *newconn; err_t err, accept_err;
conn = netconn_new(NETCONN_TCP);
while (1) { if (conn != NULL) { err = netconn_bind(conn, NULL, 7000);
if (err == ERR_OK) { netconn_listen(conn);
while (1) { accept_err = netconn_accept(conn, &newconn);
/* Process the new connection. */ if (accept_err == ERR_OK) { ... } } } else { netconn_delete(conn); } } } Т.е. все "по мануалу" и вопросов тут нет. Но вот вопрос такой тут - в функцию netconn_accept(conn, &newconn); я передал указатель на newconn, а эта функция в ответ обновила его значением указателя на свою локальную переменную (как я понял). Т.е. др. словами говоря - она создала внутри у себя какую-то локальную переменную, а потом второй параметр этой самой функции обновила уже новым значением указателя на эту переменную. И как теперь это понимать - ведь та локальная переменная существует в куче, но может же в любой момент времени быть затерта. Т.е. все работает как бы "до поры - до времени" так получается? Пока не "затрется случайно" та локальная переменная другим чем-то в ОЗУ. Или я не так понял? Или тут эта переменная newconn как бы "неполноценно" используется и в ней только что-то одно временно берется и потому все безопасно работает? Спасибо.
|
|
|
|
|
 |
Ответов
|
Apr 7 2016, 18:22
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Я после того как написал свой вопрос все переживал, что не привел код самой функции netconn_accept() из стека LwIP и думал "вот люди будут меня ругать, что не показал ее код тоже", а оказывается никто не ответил даже еще. Вот сама функция netconn_accept из стека (в ней я убрал все некомпилирующиеся куски кода из-за условной компиляции чтобы не загромождать лишним кодом, а также добавил комментарий в том месте где ожидается получение семафора - см. код): Код err_t netconn_accept(struct netconn *conn, struct netconn **new_conn) { struct netconn *newconn; err_t err;
LWIP_ERROR("netconn_accept: invalid pointer", (new_conn != NULL), return ERR_ARG;); *new_conn = NULL; LWIP_ERROR("netconn_accept: invalid conn", (conn != NULL), return ERR_ARG;); LWIP_ERROR("netconn_accept: invalid acceptmbox", sys_mbox_valid(&conn->acceptmbox), return ERR_ARG;);
err = conn->last_err; if (ERR_IS_FATAL(err)) { /* don't recv on fatal errors: this might block the application task waiting on acceptmbox forever! */ return err; }
/* т.к. 3-й параметр тут - timeout равен 0, то ждем бесконечно долго прихода message (так сделано в этой функции): */ sys_arch_mbox_fetch(&conn->acceptmbox, (void **) &newconn, 0);
/* Register event with callback */ API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);
if (newconn == NULL) { /* connection has been aborted */ NETCONN_SET_SAFE_ERR(conn, ERR_ABRT); return ERR_ABRT; }
*new_conn = newconn; /* don't set conn->last_err: it's only ERR_OK, anyway */ return ERR_OK; } Обратите внимание на строку №< последняя строка - 3> тут - вот это и есть, то о чем я писал: Код *new_conn = newconn; т.е. приравнивается значение указателя из 2-го параметра значению указателя на локальную переменную структуры! Т.е. вопрос такой в итоге (извините, что сложно может написал до этого) - "Почему эта функция netconn_accept() из стека LwIP возвращает фактически указатель на свою локальную переменную?? Это правильно??" Спасибо.
|
|
|
|
|
Apr 7 2016, 18:55
|
Частый гость
 
Группа: Свой
Сообщений: 92
Регистрация: 22-06-05
Из: Украина, г.Боярка
Пользователь №: 6 238

|
Цитата(AleksBak @ Apr 7 2016, 20:22)  Т.е. вопрос такой в итоге (извините, что сложно может написал до этого) - "Почему эта функция netconn_accept() из стека LwIP возвращает фактически указатель на свою локальную переменную?? Это правильно??" Спасибо. Она возвращает значение этой локальной переменной, а не указатель на нее
|
|
|
|
|
Apr 8 2016, 03:22
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Цитата(_NB @ Apr 7 2016, 22:55)  Она возвращает значение этой локальной переменной, а не указатель на нее Нет не так. В эту функцию передается указатель на указатель - переменная new_conn и вот такое объявление ее как параметра функции: Код struct netconn **new_conn Внутри функции объявляется свой, локальный указатель на структуру newconn (может тут кроется ответ на загадку т.к. при его объявлении выделяется память из какой-то "особой" памяти самого стека LwIP? но это бред все-таки). Далее, под конец, мы видим, что: Код *new_conn = newconn; т.е. все как писал - по переданному указателю на указателю пишется значение своего локального указателя. Тут даже и пояснять мне уже не нужно т.к. может запутываю в итоге и непонятен будет вопрос - все и так видно как на ладони.
|
|
|
|
Сообщений в этой теме
AleksBak LwIP это потенциально опасное ПО или нет? Apr 7 2016, 12:59    AleksBak Цитата(aaarrr @ Apr 8 2016, 10:23) Так в ... Apr 8 2016, 07:08 des333 AleksBak:
Представьте, Вам нужно написать функцию... Apr 8 2016, 07:13 AleksBak Цитата(des333 @ Apr 8 2016, 11:13) ...
Пр... Apr 8 2016, 07:36  des333 Цитата(AleksBak @ Apr 8 2016, 10:36) ...Т... Apr 8 2016, 07:50   AleksBak Цитата(des333 @ Apr 8 2016, 11:50) ...нап... Apr 8 2016, 08:12    des333 Цитата(AleksBak @ Apr 8 2016, 11:12) Да я... Apr 8 2016, 08:13     AleksBak Цитата(des333 @ Apr 8 2016, 12:13) Это Ва... Apr 8 2016, 08:27      Сергей Борщ QUOTE (AleksBak @ Apr 8 2016, 10:27) 3. и... Apr 8 2016, 08:58       AleksBak Цитата(Сергей Борщ @ Apr 8 2016, 12:58) .... Apr 8 2016, 09:21        Сергей Борщ QUOTE (AleksBak @ Apr 8 2016, 11:21) и по... Apr 8 2016, 10:18         AleksBak Цитата(Сергей Борщ @ Apr 8 2016, 14:18) В... Apr 8 2016, 10:38          Сергей Борщ QUOTE (AleksBak @ Apr 8 2016, 12:38) Я ду... Apr 8 2016, 10:41 gosha-z Я правильно понимаю, что newconn во втором сообщен... Apr 8 2016, 08:39 AleksBak Цитата(gosha-z @ Apr 8 2016, 12:39) ... Apr 8 2016, 08:56 AleksBak Еще пояснение: newconn - это указатель на область ... Apr 8 2016, 10:31 Сергей Борщ QUOTE (AleksBak @ Apr 8 2016, 12:31) А ес... Apr 8 2016, 10:36  AleksBak Цитата(Сергей Борщ @ Apr 8 2016, 14:36) .... Apr 8 2016, 10:53   Сергей Борщ QUOTE (AleksBak @ Apr 8 2016, 12:53) где-... Apr 8 2016, 10:58 ar__systems Вообще это довольно дерзко, не особо и в С понимая... Apr 8 2016, 14:08 AleksBak Цитата(ar__systems @ Apr 8 2016, 18:08) В... Apr 8 2016, 17:24  ar__systems Цитата(AleksBak @ Apr 8 2016, 12:24) У ме... Apr 9 2016, 20:11  jcxz Цитата(AleksBak @ Apr 8 2016, 23:24) А Вы... Apr 10 2016, 08:18   AleksBak Цитата(jcxz @ Apr 10 2016, 12:18) ...
Дин... Apr 10 2016, 08:31    jcxz Цитата(AleksBak @ Apr 10 2016, 14:31) Что... Apr 10 2016, 08:45     AleksBak Цитата(jcxz @ Apr 10 2016, 12:45) Выделен... Apr 10 2016, 09:19      aaarrr Цитата(AleksBak @ Apr 10 2016, 12:19) Код... Apr 10 2016, 09:29      jcxz Цитата(AleksBak @ Apr 10 2016, 15:19) Поя... Apr 10 2016, 09:32       AleksBak Цитата(jcxz @ Apr 10 2016, 13:32) ...Где ... Apr 10 2016, 10:23        jcxz Цитата(AleksBak @ Apr 10 2016, 16:23) это... Apr 10 2016, 11:38         AleksBak Цитата(jcxz @ Apr 10 2016, 15:38) Опять 2... Apr 10 2016, 18:25      ar__systems Цитата(AleksBak @ Apr 10 2016, 04:19) Поя... Apr 11 2016, 13:47 gosha-z MailBox - почтовый ящик.
MessageQueue - очередь со... Apr 10 2016, 18:50 AleksBak Опять я ошибся и перепутал - не "очередь сооб... Apr 10 2016, 19:24
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|