mirror of
https://github.com/CPunch/Laika.git
synced 2025-09-27 20:30:12 +00:00
CNC: Fix possible out of bounds subscript for SHELL_* packets
- content events now pass the sLaika_peer struct
This commit is contained in:
@@ -26,9 +26,9 @@ typedef uint8_t CONTENT_TYPE;
|
||||
typedef uint8_t CONTENT_ERRCODE;
|
||||
typedef uint16_t CONTENT_ID;
|
||||
|
||||
typedef void (*contentRecvEvent)(struct sLaika_contentContext *context, struct sLaika_content *content);
|
||||
typedef bool (*contentNewEvent)(struct sLaika_contentContext *context, struct sLaika_content *content);
|
||||
typedef void (*contentErrorEvent)(struct sLaika_contentContext *context, struct sLaika_content *content, CONTENT_ERRCODE err);
|
||||
typedef void (*contentRecvEvent)(struct sLaika_peer *peer, struct sLaika_contentContext *context, struct sLaika_content *content);
|
||||
typedef bool (*contentNewEvent)(struct sLaika_peer *peer, struct sLaika_contentContext *context, struct sLaika_content *content);
|
||||
typedef void (*contentErrorEvent)(struct sLaika_peer *peer, struct sLaika_contentContext *context, struct sLaika_content *content, CONTENT_ERRCODE err);
|
||||
|
||||
struct sLaika_content {
|
||||
struct sLaika_content *next;
|
||||
@@ -53,6 +53,7 @@ void laikaF_cleanContext(struct sLaika_contentContext *context);
|
||||
|
||||
void laikaF_setupEvents(struct sLaika_contentContext *context, contentRecvEvent onRecv, contentNewEvent onNew, contentErrorEvent onError);
|
||||
|
||||
int laikaF_nextID(struct sLaika_peer *peer); /* returns the id that will be assigned to the next sent content */
|
||||
int laikaF_sendContent(struct sLaika_peer *peer, FILE *fd, CONTENT_TYPE type);
|
||||
|
||||
void laikaF_pollContent(struct sLaika_peer *peer);
|
||||
|
@@ -110,6 +110,10 @@ struct sLaika_content* laikaF_newContent(struct sLaika_contentContext *context,
|
||||
return content;
|
||||
}
|
||||
|
||||
int laikaF_nextID(struct sLaika_peer *peer) {
|
||||
return peer->context.nextID + 1;
|
||||
}
|
||||
|
||||
int laikaF_sendContent(struct sLaika_peer *peer, FILE *fd, CONTENT_TYPE type) {
|
||||
struct sLaika_contentContext *context = &peer->context;
|
||||
struct sLaika_content *content = laikaF_newContent(context, fd, getSize(fd), context->nextID++, type, CONTENT_OUT);
|
||||
@@ -180,7 +184,7 @@ void laikaF_handleContentNew(struct sLaika_peer *peer, LAIKAPKT_SIZE sz, void *u
|
||||
contentType = laikaS_readByte(&peer->sock);
|
||||
|
||||
content = laikaF_recvContent(peer, contentID, contentSize, contentType);
|
||||
if (context->onNew && !context->onNew(context, content)) {
|
||||
if (context->onNew && !context->onNew(peer, context, content)) {
|
||||
sendContentError(peer, contentID, CONTENT_ERR_REJECTED);
|
||||
rmvContent(context, content);
|
||||
}
|
||||
@@ -200,7 +204,7 @@ void laikaF_handleContentError(struct sLaika_peer *peer, LAIKAPKT_SIZE sz, void
|
||||
|
||||
LAIKA_DEBUG("We received an errcode for id %d, err: %d\n", contentID, errCode);
|
||||
if (context->onError) /* check if event exists! */
|
||||
context->onError(context, content, errCode);
|
||||
context->onError(peer, context, content, errCode);
|
||||
|
||||
rmvContent(context, content);
|
||||
}
|
||||
@@ -226,6 +230,6 @@ void laikaF_handleContentChunk(struct sLaika_peer *peer, LAIKAPKT_SIZE sz, void
|
||||
rmvContent(context, content);
|
||||
} else if ((content->processed += bodySz) == content->sz) {
|
||||
if (context->onReceived) /* check if event exists! */
|
||||
context->onReceived(context, content);
|
||||
context->onReceived(peer, context, content);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user