Skip to content

Commit 89d9e2f

Browse files
authored
Fix error handling in wehbook server [TOB-LNKD-9] (#7882)
When the webhook server decodes a request's JSON payload, it may try to use a nil value when handling the error. Furthermore, if the JSON payload has a `nil` `Request` value, it may attempt to dereference the value. This change improves the webhook server's error handling to return a `400 Bad Request` status if either of these cases are encountered. Signed-off-by: Oliver Gould <ver@buoyant.io>
1 parent bac0081 commit 89d9e2f

File tree

1 file changed

+15
-14
lines changed

1 file changed

+15
-14
lines changed

controller/webhook/server.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"crypto/tls"
66
"encoding/json"
7+
"fmt"
78
"io/ioutil"
89
"net/http"
910
"sync/atomic"
@@ -135,7 +136,12 @@ func (s *Server) serve(res http.ResponseWriter, req *http.Request) {
135136
return
136137
}
137138

138-
response := s.processReq(req.Context(), data)
139+
response, err := s.processReq(req.Context(), data)
140+
if err != nil {
141+
http.Error(res, err.Error(), http.StatusBadRequest)
142+
return
143+
}
144+
139145
responseJSON, err := json.Marshal(response)
140146
if err != nil {
141147
http.Error(res, err.Error(), http.StatusInternalServerError)
@@ -148,20 +154,15 @@ func (s *Server) serve(res http.ResponseWriter, req *http.Request) {
148154
}
149155
}
150156

151-
func (s *Server) processReq(ctx context.Context, data []byte) *admissionv1beta1.AdmissionReview {
157+
func (s *Server) processReq(ctx context.Context, data []byte) (*admissionv1beta1.AdmissionReview, error) {
152158
admissionReview, err := decode(data)
153159
if err != nil {
154-
log.Errorf("failed to decode data. Reason: %s", err)
155-
admissionReview.Response = &admissionv1beta1.AdmissionResponse{
156-
UID: admissionReview.Request.UID,
157-
Allowed: false,
158-
Result: &metav1.Status{
159-
Message: err.Error(),
160-
},
161-
}
162-
return admissionReview
160+
return nil, fmt.Errorf("failed to decode admission review request: %w", err)
161+
}
162+
if admissionReview.Request == nil || admissionReview.Request.UID == "" {
163+
return nil, fmt.Errorf("invalid admission review request")
163164
}
164-
log.Infof("received admission review request %s", admissionReview.Request.UID)
165+
log.Infof("received admission review request %q", admissionReview.Request.UID)
165166
log.Debugf("admission request: %+v", admissionReview.Request)
166167

167168
admissionResponse, err := s.handler(ctx, s.api, admissionReview.Request, s.recorder)
@@ -174,11 +175,11 @@ func (s *Server) processReq(ctx context.Context, data []byte) *admissionv1beta1.
174175
Message: err.Error(),
175176
},
176177
}
177-
return admissionReview
178+
return admissionReview, nil
178179
}
179180
admissionReview.Response = admissionResponse
180181

181-
return admissionReview
182+
return admissionReview, nil
182183
}
183184

184185
// Shutdown initiates a graceful shutdown of the underlying HTTP server.

0 commit comments

Comments
 (0)