| 
									
										
										
										
											2015-08-04 04:23:44 +08:00
										 |  |  | // Copyright 2015 The Prometheus Authors
 | 
					
						
							|  |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Only build when go-fuzz is in use
 | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | // +build gofuzz
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 04:23:44 +08:00
										 |  |  | package promql | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-07 16:29:38 +08:00
										 |  |  | import "github.com/prometheus/prometheus/pkg/textparse" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 04:23:44 +08:00
										 |  |  | // PromQL parser fuzzing instrumentation for use with
 | 
					
						
							|  |  |  | // https://github.com/dvyukov/go-fuzz.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Fuzz each parser by building appropriately instrumented parser, ex.
 | 
					
						
							|  |  |  | // FuzzParseMetric and execute it with it's
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //     go-fuzz-build -func FuzzParseMetric -o FuzzParseMetric.zip github.com/prometheus/prometheus/promql
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // And then run the tests with the appropriate inputs
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //     go-fuzz -bin FuzzParseMetric.zip -workdir fuzz-data/ParseMetric
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Further input samples should go in the folders fuzz-data/ParseMetric/corpus.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Repeat for ParseMetricSeletion, ParseExpr and ParseStmt.
 | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 04:23:44 +08:00
										 |  |  | // Tuning which value is returned from Fuzz*-functions has a strong influence
 | 
					
						
							|  |  |  | // on how quick the fuzzer converges on "interesting" cases. At least try
 | 
					
						
							|  |  |  | // switching between fuzzMeh (= included in corpus, but not a priority) and
 | 
					
						
							|  |  |  | // fuzzDiscard (=don't use this input for re-building later inputs) when
 | 
					
						
							|  |  |  | // experimenting.
 | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2015-08-04 04:23:44 +08:00
										 |  |  | 	fuzzInteresting = 1 | 
					
						
							|  |  |  | 	fuzzMeh         = 0 | 
					
						
							|  |  |  | 	fuzzDiscard     = -1 | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 04:23:44 +08:00
										 |  |  | // Fuzz the metric parser.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Note that his is not the parser for the text-based exposition-format; that
 | 
					
						
							|  |  |  | // lives in github.com/prometheus/client_golang/text.
 | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | func FuzzParseMetric(in []byte) int { | 
					
						
							| 
									
										
										
										
											2017-07-07 16:29:38 +08:00
										 |  |  | 	p := textparse.New(in) | 
					
						
							|  |  |  | 	for p.Next() { | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if p.Err() == nil { | 
					
						
							| 
									
										
										
										
											2015-08-04 04:23:44 +08:00
										 |  |  | 		return fuzzInteresting | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-10 17:46:03 +08:00
										 |  |  | 	return fuzzMeh | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 04:23:44 +08:00
										 |  |  | // Fuzz the metric selector parser.
 | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | func FuzzParseMetricSelector(in []byte) int { | 
					
						
							| 
									
										
										
										
											2015-08-04 04:23:44 +08:00
										 |  |  | 	_, err := ParseMetricSelector(string(in)) | 
					
						
							|  |  |  | 	if err == nil { | 
					
						
							|  |  |  | 		return fuzzInteresting | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-10 17:46:03 +08:00
										 |  |  | 	return fuzzMeh | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 04:23:44 +08:00
										 |  |  | // Fuzz the expression parser.
 | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | func FuzzParseExpr(in []byte) int { | 
					
						
							| 
									
										
										
										
											2015-08-04 04:23:44 +08:00
										 |  |  | 	_, err := ParseExpr(string(in)) | 
					
						
							|  |  |  | 	if err == nil { | 
					
						
							|  |  |  | 		return fuzzInteresting | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-10 17:46:03 +08:00
										 |  |  | 	return fuzzMeh | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 04:23:44 +08:00
										 |  |  | // Fuzz the parser.
 | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | func FuzzParseStmts(in []byte) int { | 
					
						
							| 
									
										
										
										
											2015-08-04 04:23:44 +08:00
										 |  |  | 	_, err := ParseStmts(string(in)) | 
					
						
							|  |  |  | 	if err == nil { | 
					
						
							|  |  |  | 		return fuzzInteresting | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-10 17:46:03 +08:00
										 |  |  | 	return fuzzMeh | 
					
						
							| 
									
										
										
										
											2015-07-30 04:32:02 +08:00
										 |  |  | } |