D
das.chaos
Guest
Verstaendnissfrage bzgl. dynam. Speicherallozierung im Hinblik auf Kernelprogrammierung
Hi,
da ich mir (in einem Anfall von Groeszenwahn *g*) versuche Kernelprogrammierung beizubringen, ein paar kleine, elementare Verstaendnissfragen bzgl. Autodidaktik...
Ich benutze zur Zeit FreeBSD 8.x. Folgendes Szenario ist gegeben (bei grober Betrachtung, es funktioniert):
Eine Prozedur welche bspw. einem dl_rahmen abgekapselten ppp_pr_paket extrahierte Information bzgl. ppp_pr_opt (siehe bspw. RFC1661, Seite 38)
als String auswertet (weil sich diese Prozedur auf eine ppp_pr_opt xyz bezieht wo definitiv zu erwarten ist, dasz ein String die uebermittelte Information stellt) und diese bspw. LOG(9) uebergibt:
Da ich getrieben von staendiger Angst vor einem sogenannten Memory Leak oder Aehnlichem bin *heul*, beziehen sich meine Fragen u.a. auf folgendes Codefragment:
Waere das ein korrekter Gebrauch von MALLOC(9) innerhalb diesem Zusammenhang bzw. ist die Speicherallozierung bzgl.
notwendig? Kann ich anstatt o.g. Fragment bzw.
verwenden, also ist hier MALLOC(9) in diesem Zusammenhang notwendig? Wenn nicht, der Interesse halt halber, warum (was eigendlich die Kernfrage ist, mir ist bewusst, dasz man die dynam. Speicherverwaltung in C immer im Blickfeld haben musz)? Sind die Anweisungen der Art 'ptr = NULL;' bzgl. den Zeigern: 'dt_len' und 'dt' ueberfluessig? Oder wenn diese nicht ueberfluessig sind und nicht gegeben seien, koennen sich diese dann als sogennante 'wilde Pointer' ihr dasein entfalten?
Ferner, sei es als Alternative zu o.g. empfehlenswert auf "struct msg_s" zu verzichten (man musz ja das Rad nicht neu erfinden) und mittels Funktionen bzgl. SBUF(9) Informationen aufzubereiten und dann LOG(9) zu uebergeben?
mfg
das.chaos
Hi,
da ich mir (in einem Anfall von Groeszenwahn *g*) versuche Kernelprogrammierung beizubringen, ein paar kleine, elementare Verstaendnissfragen bzgl. Autodidaktik...
Ich benutze zur Zeit FreeBSD 8.x. Folgendes Szenario ist gegeben (bei grober Betrachtung, es funktioniert):
Eine Prozedur welche bspw. einem dl_rahmen abgekapselten ppp_pr_paket extrahierte Information bzgl. ppp_pr_opt (siehe bspw. RFC1661, Seite 38)
Code:
0 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length | Data ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|--> ppp_opt_xyz_subnode_info()
|
^
curr_pos: fr_off
Code:
void
ppp_opt_xyz_subnode_info(fr_prm_t *frcb, u_char *fr, pppoe_t *phcb)
{
struct msg_len_s {
uint8_t val;
};
struct msg_len_s *dt_len = (struct msg_len_s *)(fr + frcb->fr_off);
frcb->fr_off += sizeof(struct msg_len_s);
if (dt_len->val != DT_EMPTY) { /* #define DT_EMPTY 0x00 */
struct raw_dt_s {
u_char b_str[dt_len->val];
};
struct raw_dt_s *dt = (struct raw_dt_s *)(fr + frcb->fr_off);
frcb->fr_off += sizeof(struct raw_dt_s);
struct msg_s {
u_char info_str[dt_len->val + 1];
};
struct msg_s *msg;
if ((msg = (struct msg_s *)malloc(sizeof(struct msg_s), M_TEMP, M_ZERO)) == NULL) {
dt = NULL;
dt_len = NULL;
return;
}
(void)sprintf(msg->info_str, "%s%c", dt->b_str, '\0');
log(LOG_PRINTF, "blablubb: %s", msg->info_str);
free((void *)msg, M_TEMP);
dt = NULL;
}
dt_len = NULL;
}
Code:
struct msg_s {
u_char info_str[dt_len->val + 1];
};
struct msg_s *msg;
if ((msg = (struct msg_s *)malloc(sizeof(struct msg_s), M_TEMP, M_ZERO)) == NULL) {
dt = NULL;
dt_len = NULL;
return;
}
(void)sprintf(msg->info_str, "%s%c", dt->b_str, '\0');
log(LOG_PRINTF, "blablubb: %s", msg->info_str);
free((void *)msg, M_TEMP);
Code:
struct msg_s {
u_char info_str[dt_len->val + 1];
};
Code:
struct msg_s {
u_char info_str[dt_len->val + 1];
};
struct msg_s msg;
(void)sprintf(msg->info_str, "%s%c", dt->b_str, '\0');
log(LOG_PRINTF, "blablubb: %s", msg->info_str);
Ferner, sei es als Alternative zu o.g. empfehlenswert auf "struct msg_s" zu verzichten (man musz ja das Rad nicht neu erfinden) und mittels Funktionen bzgl. SBUF(9) Informationen aufzubereiten und dann LOG(9) zu uebergeben?
mfg
das.chaos