Skip to content

Commit f61d926

Browse files
committed
fix crash: null ptr in hls+
1 parent 5809c7c commit f61d926

12 files changed

+158
-10
lines changed

build/download

Lines changed: 0 additions & 1 deletion
This file was deleted.

hls/ngx_rtmp_hls_module.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2144,6 +2144,9 @@ ngx_rtmp_hls_video(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
21442144
ngx_log_error(NGX_LOG_ERR, s->log, 0,
21452145
"hls: error appending AUD NAL");
21462146
}
2147+
aud_sent = 1;
2148+
break;
2149+
21472150
case 9:
21482151
aud_sent = 1;
21492152
break;

http/ngx_http_flv_live_module.c

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ static void *ngx_http_flv_live_create_loc_conf(ngx_conf_t *cf);
2020
static char *ngx_http_flv_live_merge_loc_conf(ngx_conf_t *cf, void *parent,
2121
void *child);
2222

23-
static u_char ngx_flv_live_header[] = "FLV\x1\x5\0\0\0\x9\0\0\0\0";
23+
static u_char ngx_flv_live_audio_header[] = "FLV\x1\x1\0\0\0\x9\0\0\0\0";
24+
static u_char ngx_flv_live_video_header[] = "FLV\x1\x4\0\0\0\x9\0\0\0\0";
25+
static u_char ngx_flv_live_av_header[] = "FLV\x1\x5\0\0\0\x9\0\0\0\0";
2426

2527
static ngx_keyval_t ngx_http_flv_live_headers[] = {
2628
{ ngx_string("Cache-Control"), ngx_string("no-cache") },
@@ -41,6 +43,8 @@ typedef struct {
4143
ngx_str_t swf_url;
4244
ngx_str_t tc_url;
4345
ngx_str_t page_url;
46+
ngx_uint_t audio;
47+
ngx_uint_t video;
4448

4549
ngx_rtmp_addr_conf_t *addr_conf;
4650
} ngx_http_flv_live_loc_conf_t;
@@ -49,7 +53,7 @@ typedef struct {
4953
static ngx_command_t ngx_http_flv_live_commands[] = {
5054

5155
{ ngx_string("flv_live"),
52-
NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
56+
NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,
5357
ngx_http_flv_live,
5458
NGX_HTTP_LOC_CONF_OFFSET,
5559
0,
@@ -97,11 +101,14 @@ ngx_http_flv_live_send_header(ngx_http_request_t *r)
97101
ngx_keyval_t *h;
98102
ngx_buf_t *b;
99103
ngx_chain_t out;
104+
ngx_http_flv_live_loc_conf_t *hflcf;
100105

101106
if (r->header_sent) {
102107
return NGX_OK;
103108
}
104109

110+
hflcf = ngx_http_get_module_loc_conf(r, ngx_http_flv_live_module);
111+
105112
r->headers_out.status = NGX_HTTP_OK;
106113
r->keepalive = 0; /* set Connection to closed */
107114

@@ -124,8 +131,32 @@ ngx_http_flv_live_send_header(ngx_http_request_t *r)
124131
return NGX_HTTP_INTERNAL_SERVER_ERROR;
125132
}
126133

127-
b->start = b->pos = ngx_flv_live_header;
128-
b->end = b->last = ngx_flv_live_header + sizeof(ngx_flv_live_header) - 1;
134+
switch (hflcf->audio | (hflcf->video < 1)) {
135+
case 1: // audio only
136+
b->start = b->pos = ngx_flv_live_audio_header;
137+
b->end = b->last = ngx_flv_live_audio_header +
138+
sizeof(ngx_flv_live_audio_header) - 1;
139+
break;
140+
141+
case 2: // video only
142+
b->start = b->pos = ngx_flv_live_video_header;
143+
b->end = b->last = ngx_flv_live_video_header +
144+
sizeof(ngx_flv_live_video_header) - 1;
145+
break;
146+
147+
case 3: // audio and video
148+
b->start = b->pos = ngx_flv_live_av_header;
149+
b->end = b->last = ngx_flv_live_av_header +
150+
sizeof(ngx_flv_live_av_header) - 1;
151+
break;
152+
153+
default:
154+
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
155+
"flv-live: send_header| av header config error.");
156+
157+
return NGX_HTTP_INTERNAL_SERVER_ERROR;
158+
}
159+
129160
b->memory = 1;
130161

131162
out.buf = b;
@@ -631,6 +662,7 @@ ngx_http_flv_live(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
631662
ngx_http_flv_live_loc_conf_t *hflcf;
632663
ngx_str_t *value, v;
633664
ngx_uint_t i;
665+
ngx_uint_t audio, video;
634666

635667
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
636668
clcf->handler = ngx_http_flv_live_handler;
@@ -644,15 +676,37 @@ ngx_http_flv_live(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
644676
return NGX_CONF_ERROR;
645677
}
646678

679+
audio = NGX_CONF_UNSET_UINT;
680+
video = NGX_CONF_UNSET_UINT;
681+
647682
for (i = 2; i < cf->args->nelts; ++i) {
648683
if (ngx_strncmp(value[i].data, "app=", 4) == 0) {
649684
v.data = value[i].data + 4;
650685
v.len = value[i].len - 4;
651686
hflcf->app = v;
687+
} else if (ngx_strncmp(value[i].data, "audio=", 6) == 0) {
688+
v.data = value[i].data + 6;
689+
v.len = value[i].len - 6;
690+
audio = ngx_atoi(v.data, v.len);
691+
} else if (ngx_strncmp(value[i].data, "video=", 6) == 0) {
692+
v.data = value[i].data + 6;
693+
v.len = value[i].len - 6;
694+
video = ngx_atoi(v.data, v.len);
652695
} else {
653696
return NGX_CONF_ERROR;
654697
}
655698
}
656699

700+
if (audio == NGX_CONF_UNSET_UINT) {
701+
audio = 1;
702+
}
703+
704+
if (video == NGX_CONF_UNSET_UINT) {
705+
video = 1;
706+
}
707+
708+
hflcf->audio = audio;
709+
hflcf->video = video;
710+
657711
return NGX_CONF_OK;
658712
}

mpegts/ngx_hls_live_module.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,11 @@ ngx_hls_live_write_playlist(ngx_rtmp_session_t *s, ngx_buf_t *out,
246246
ngx_hls_live_app_conf_t *hacf;
247247

248248
ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);
249+
if (ctx == NULL) {
250+
ngx_log_error(NGX_LOG_ERR, s->log, 0, "hls-live: playlist| ctx is null");
251+
252+
return NGX_ERROR;
253+
}
249254

250255
ctx->last_time = time(NULL);
251256

@@ -788,6 +793,10 @@ ngx_hls_live_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)
788793
ngx_del_timer(&ctx->ev);
789794
}
790795

796+
if (ctx->stream == NULL) {
797+
goto next;
798+
}
799+
791800
ngx_rtmp_fire_event(s, NGX_MPEGTS_MSG_CLOSE, NULL, NULL);
792801

793802
ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,

mpegts/ngx_mpegts_live_module.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,6 +1280,9 @@ ngx_mpegts_live_h264_handler(ngx_rtmp_session_t *s, ngx_rtmp_frame_t *f)
12801280
ngx_log_error(NGX_LOG_ERR, s->log, 0,
12811281
"mpegts-mux: h264_handler| error appending AUD NAL");
12821282
}
1283+
aud_sent = 1;
1284+
break;
1285+
12831286
case 9:
12841287
aud_sent = 1;
12851288
break;

ngx_live_record.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,9 @@ ngx_live_record_avc(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
10001000
ngx_log_error(NGX_LOG_ERR, s->log, 0,
10011001
"record: error appending AUD NAL");
10021002
}
1003+
aud_sent = 1;
1004+
break;
1005+
10031006
case 9:
10041007
aud_sent = 1;
10051008
break;

ngx_live_relay_static.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include "ngx_map.h"
1111
#include "ngx_dynamic_conf.h"
1212
#include "ngx_rtmp_dynamic.h"
13-
13+
#include "ngx_dynamic_resolver.h"
1414

1515
static ngx_live_pull_pt next_pull;
1616

@@ -546,6 +546,8 @@ ngx_live_relay_pull(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
546546
return "invalid port";
547547
}
548548

549+
ngx_dynamic_resolver_add_domain(&url->url.host, cf->cycle);
550+
549551
continue;
550552
}
551553

ngx_rtmp_access_module.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,17 @@ ngx_rtmp_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
410410
break;
411411
}
412412

413+
rule = ngx_array_push(&ascf->rules);
414+
if (rule == NULL) {
415+
return NGX_CONF_ERROR;
416+
}
417+
418+
rule->mask = cidr.u.in.mask;
419+
rule->addr = cidr.u.in.addr;
420+
rule->deny = (value[0].data[0] == 'd') ? 1 : 0;
421+
rule->flags = flags;
422+
423+
break;
413424
/* "all" passes through */
414425
#endif
415426

ngx_rtmp_amf.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,10 @@ ngx_rtmp_amf_read(ngx_rtmp_amf_ctx_t *ctx, ngx_rtmp_amf_elt_t *elts,
330330
case NGX_DONE:
331331
if (elts->type & NGX_RTMP_AMF_OPTIONAL) {
332332
return NGX_OK;
333+
} else {
334+
return NGX_ERROR;
333335
}
336+
break;
334337
case NGX_ERROR:
335338
return NGX_ERROR;
336339
}
@@ -398,6 +401,13 @@ ngx_rtmp_amf_read(ngx_rtmp_amf_ctx_t *ctx, ngx_rtmp_amf_elt_t *elts,
398401
if (ngx_rtmp_amf_get(ctx, &max_index, 4) != NGX_OK) {
399402
return NGX_ERROR;
400403
}
404+
if (ngx_rtmp_amf_read_object(ctx, data,
405+
data && elts ? elts->len / sizeof(ngx_rtmp_amf_elt_t) : 0
406+
) != NGX_OK)
407+
{
408+
return NGX_ERROR;
409+
}
410+
break;
401411

402412
case NGX_RTMP_AMF_OBJECT:
403413
if (ngx_rtmp_amf_read_object(ctx, data,
@@ -593,6 +603,15 @@ ngx_rtmp_amf_write(ngx_rtmp_amf_ctx_t *ctx,
593603
return NGX_ERROR;
594604
}
595605

606+
type8 = NGX_RTMP_AMF_END;
607+
if (ngx_rtmp_amf_write_object(ctx, data,
608+
elts[n].len / sizeof(ngx_rtmp_amf_elt_t)) != NGX_OK
609+
|| ngx_rtmp_amf_put(ctx, &type8, 1) != NGX_OK)
610+
{
611+
return NGX_ERROR;
612+
}
613+
break;
614+
596615
case NGX_RTMP_AMF_OBJECT:
597616
type8 = NGX_RTMP_AMF_END;
598617
if (ngx_rtmp_amf_write_object(ctx, data,

ngx_rtmp_eval.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,19 @@ ngx_rtmp_eval(void *ctx, ngx_str_t *in, ngx_rtmp_eval_t **e, ngx_str_t *out,
154154

155155
name.len = p - name.data;
156156
ngx_rtmp_eval_append_var(ctx, &b, e, &name, log);
157+
switch (c) {
158+
case '$':
159+
name.data = p + 1;
160+
state = NAME;
161+
continue;
162+
case '\\':
163+
state = ESCAPE;
164+
continue;
165+
}
166+
167+
ngx_rtmp_eval_append(&b, &c, 1, log);
168+
state = NORMAL;
169+
break;
157170

158171
case NORMAL:
159172
switch (c) {
@@ -165,6 +178,9 @@ ngx_rtmp_eval(void *ctx, ngx_str_t *in, ngx_rtmp_eval_t **e, ngx_str_t *out,
165178
state = ESCAPE;
166179
continue;
167180
}
181+
ngx_rtmp_eval_append(&b, &c, 1, log);
182+
state = NORMAL;
183+
break;
168184

169185
case ESCAPE:
170186
ngx_rtmp_eval_append(&b, &c, 1, log);

ngx_rtmp_init.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,22 @@ ngx_rtmp_init_connection(ngx_connection_t *c)
125125
case AF_UNIX:
126126
unix_socket = 1;
127127

128+
sin = (struct sockaddr_in *) sa;
129+
130+
addr = port->addrs;
131+
132+
/* the last address is "*" */
133+
134+
for (i = 0; i < port->naddrs - 1; i++) {
135+
if (addr[i].addr == sin->sin_addr.s_addr) {
136+
break;
137+
}
138+
}
139+
140+
addr_conf = &addr[i].conf;
141+
142+
break;
143+
128144
default: /* AF_INET */
129145
sin = (struct sockaddr_in *) sa;
130146

@@ -155,6 +171,9 @@ ngx_rtmp_init_connection(ngx_connection_t *c)
155171

156172
case AF_UNIX:
157173
unix_socket = 1;
174+
addr = port->addrs;
175+
addr_conf = &addr[0].conf;
176+
break;
158177

159178
default: /* AF_INET */
160179
addr = port->addrs;
@@ -373,6 +392,7 @@ ngx_rtmp_finalize_session(ngx_rtmp_session_t *s)
373392

374393
if (s->live_type == NGX_HLS_LIVE) {
375394
ngx_rtmp_finalize_fake_session(s);
395+
return;
376396
}
377397

378398
if (s->destroyed) {

ngx_rtmp_oclp_module.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,11 @@ ngx_rtmp_oclp_create_event(ngx_conf_t *cf, ngx_rtmp_oclp_event_t *event,
463463

464464
event->url.len = values[i].len;
465465
event->url.data = values[i].data;
466+
if (values[i].data[values[i].len - 1] != '/') {
467+
event->url.data = ngx_pcalloc(cf->pool, values[i].len + 1);
468+
event->url.len = values[i].len + 1;
469+
ngx_snprintf(event->url.data, event->url.len, "%V/", &values[i]);
470+
}
466471

467472
if (ngx_parse_request_url(&ru, &event->url) != NGX_OK) {
468473
ngx_conf_log_error(NGX_LOG_WARN, cf, 0, "request url format error");
@@ -738,13 +743,17 @@ ngx_rtmp_oclp_common_url(ngx_str_t *url, ngx_rtmp_session_t *s,
738743
buf = p;
739744

740745
if (ru.args.len) { // url already has args
741-
p = ngx_snprintf(buf, len, "&call=%s&act=%s&domain=%V&app=%V&name=%V",
746+
p = ngx_snprintf(buf, len,
747+
"&call=%s&act=%s&domain=%V&app=%V&name=%V&clientid=%D",
742748
ngx_rtmp_oclp_app_type[nctx->type],
743-
ngx_rtmp_oclp_stage[stage], &s->domain, &s->app, &s->name);
749+
ngx_rtmp_oclp_stage[stage],
750+
&s->domain, &s->app, &s->name, s->number);
744751
} else {
745-
p = ngx_snprintf(buf, len, "?call=%s&act=%s&domain=%V&app=%V&name=%V",
752+
p = ngx_snprintf(buf, len,
753+
"?call=%s&act=%s&domain=%V&app=%V&name=%V&clientid=%D",
746754
ngx_rtmp_oclp_app_type[nctx->type],
747-
ngx_rtmp_oclp_stage[stage], &s->domain, &s->app, &s->name);
755+
ngx_rtmp_oclp_stage[stage],
756+
&s->domain, &s->app, &s->name, s->number);
748757
}
749758
len -= p - buf;
750759
buf = p;

0 commit comments

Comments
 (0)